0

Problem:

To set session variable and redirect user to different PHP-page once upload of .txt file has been completed using jQuery File Upload.

HTML code (upload.php):

<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
    <i class="glyphicon glyphicon-plus"></i>
    <span>Add files...</span>
    <!-- The file input field used as target for the file upload widget -->
    <input id="fileupload" type="file" name="files[]" multiple>
</span>
<br>
<br>
<!-- The global progress bar -->
<div id="progress" class="progress">
    <div class="progress-bar progress-bar-success"></div>
</div>
<!-- The container for the uploaded files -->
<div id="files" class="files"></div>

jQuery code (upload.php):

<script>    
    $(function () {
        'use strict';
        // Server-side upload handler:
        var url = 'process.php';

        $('#fileupload').fileupload({
            url: url,
            autoUpload: true,
            acceptFileTypes: /(\.|\/)(txt)$/i,
            maxFileSize: 5000000, // 5 MB
            done: function (e, data) {
                $(this).delay(2000, function(){
                    window.location = "explorer.php";
                });
            },
            progressall: function (e, data) {
                var progress = parseInt(data.loaded / data.total * 100, 10);
                $('#progress .progress-bar').css(
                    'width',
                    progress + '%'
                );
            }
        }).prop('disabled', !$.support.fileInput)
            .parent().addClass($.support.fileInput ? undefined : 'disabled');
    });
</script>

PHP upload script (process.php):

<?php
    session_start();

    $folder      = 'upload';

    if (!empty($_FILES))
    {
        // Set temporary name
        $tmp    = $_FILES['files']['tmp_name'];

        // Set target path and file name
        $target = $folder . '/' . $_FILES['files']['name'];

        // Upload file to target folder
        $status = move_uploaded_file($tmp, $target);

        if ($status)
        {
            // Set session with txtfile name
            $_SESSION['txtfile'] = $_FILES['files']['name'];
        }
    }
?>

Desired output:

  • Text file should be uploaded to folder /upload - which currently has chmod 777
  • Session of text file name should be assigned to the variable $_SESSION['txtfile']
  • Redirect user once upload is done to the file "explorer.php"

EDIT: SOLVED. Final code above!

2
  • any error messages? what currently happens when you run this? Commented Oct 21, 2013 at 21:01
  • No error messages but nothing gets uploaded either. Commented Oct 21, 2013 at 21:04

1 Answer 1

3

For starters...

Notice your input name is files[] and has attribute multiple. This means that you are sending an array of files to the server so to reference them in php, you'll need something like this:

$_FILES['files']['name'][0]

for the first file.

Also, I have found that move_uploaded_file() likes full paths for the destination, try tacking on $_SERVER['DOCUMENT_ROOT'].

To send information back to jQuery you would want to use echo json_encode() like so...

echo json_encode(array(
    'status' => $status,
    'message' => 'your message here'
));

In your done function the data can be accessed like this:

done: function(e, data){
     console.log(data.status);
     console.log(data.message);
}
Sign up to request clarification or add additional context in comments.

14 Comments

Ok, this solved the uploading issue. Now the file does get uploaded. But how do I send back a response to jQuery to move the person to "explorer.php"?
you could send back html, use a script to set window.location, if your current method is not working...
Not sure I follow, I suspect that the "done:" part should be modified. But how would I return an answer from process.php back to jQuery?
Shouldn't I just be able to put window.location = "explorer.php"; in done:? I tried it but didn't work. Updated with new code.
that would do it, if you arent using echo json_encode()....and for the delay, you could wrap everything inside of a setTimeout()
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.