Plupload Not Uploading Files

Iain Simpson picture Iain Simpson · Sep 12, 2012 · Viewed 8.2k times · Source

I have a strange problem with the Jquery library Plupload http://www.plupload.com . I have added it to my website and it 'appears' to be working, but isn't. When you select a file it looks like its being uploaded and it even says done when finished but the files never appear on my server, no errors are reported either.

The uploader can be seen 'working'...or not here, when the files are uploaded properly, refreshing the page should make them appear as a thumbnail on that page >> http://www.towerroadacademy.co.uk/index.php/slideshow-editor

The Jquery I am using in my index.php head is as follows >>

<!-- Load Queue widget CSS and jQuery -->
<style type="text/css">@import url(/plupload/js/jquery.plupload.queue/css/jquery.plupload.queue.css);</style>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>

<!-- Third party script for BrowserPlus runtime (Google Gears included in Gears runtime now) -->
<script type="text/javascript" src="http://bp.yahooapis.com/2.4.21/browserplus-min.js"></script>

<!-- Load plupload and all it's runtimes and finally the jQuery queue widget -->
<script type="text/javascript" src="/plupload/js/plupload.full.js"></script>
<script type="text/javascript" src="/plupload/js/jquery.plupload.queue/jquery.plupload.queue.js"></script>

<script type="text/javascript">
// Convert divs to queue widgets when the DOM is ready
var $j = jQuery.noConflict();
$j(function() {
function log() {
var str = "";

plupload.each(arguments, function(arg) {
    var row = "";

    if (typeof(arg) != "string") {
        plupload.each(arg, function(value, key) {
            // Convert items in File objects to human readable form
            if (arg instanceof plupload.File) {
                // Convert status to human readable
                switch (value) {
                    case plupload.QUEUED:
                        value = 'QUEUED';
                        break;

                    case plupload.UPLOADING:
                        value = 'UPLOADING';
                        break;

                    case plupload.FAILED:
                        value = 'FAILED';
                        break;

                    case plupload.DONE:
                        value = 'DONE';
                        break;
                }
            }

            if (typeof(value) != "function") {
                row += (row ? ', ' : '') + key + '=' + value;
            }
        });

        str += row + " ";
    } else { 
        str += arg + " ";
    }
});

$j('#log').append(str + "\n");
}

$j("#uploader").pluploadQueue({
// General settings
runtimes : 'flash,gears,flash,silverlight,browserplus,html5',
url : '/plupload/upload.php',
max_file_size : '10mb',
chunk_size : '1mb',
unique_names : true,

// Resize images on clientside if we can
resize : {width : 320, height : 240, quality : 90},

// Specify what files to browse for
filters : [
    {title : "Image files", extensions : "jpg,gif,png"},
    {title : "Zip files", extensions : "zip"}
],

// Flash settings
flash_swf_url : '/plupload/js/plupload.flash.swf',

// Silverlight settings
silverlight_xap_url : '/plupload/js/plupload.silverlight.xap',

// PreInit events, bound before any internal events
preinit : {
    Init: function(up, info) {
        log('[Init]', 'Info:', info, 'Features:', up.features);
    },

    UploadFile: function(up, file) {
        log('[UploadFile]', file);

        // You can override settings before the file is uploaded
        // up.settings.url = 'upload.php?id=' + file.id;
        // up.settings.multipart_params = {param1 : 'value1', param2 : 'value2'};
    }
},

// Post init events, bound after the internal events
init : {
    Refresh: function(up) {
        // Called when upload shim is moved
        log('[Refresh]');
    },

    StateChanged: function(up) {
        // Called when the state of the queue is changed
        log('[StateChanged]', up.state == plupload.STARTED ? "STARTED" : "STOPPED");
    },

    QueueChanged: function(up) {
        // Called when the files in queue are changed by adding/removing files
        log('[QueueChanged]');
    },

    UploadProgress: function(up, file) {
        // Called while a file is being uploaded
        log('[UploadProgress]', 'File:', file, "Total:", up.total);
    },

    FilesAdded: function(up, files) {
        // Callced when files are added to queue
        log('[FilesAdded]');

        plupload.each(files, function(file) {
            log('  File:', file);
        });
    },

    FilesRemoved: function(up, files) {
        // Called when files where removed from queue
        log('[FilesRemoved]');

        plupload.each(files, function(file) {
            log('  File:', file);
        });
    },

    FileUploaded: function(up, file, info) {
        // Called when a file has finished uploading
        log('[FileUploaded] File:', file, "Info:", info);
    },

    ChunkUploaded: function(up, file, info) {
        // Called when a file chunk has finished uploading
        log('[ChunkUploaded] File:', file, "Info:", info);
    },

    Error: function(up, args) {
        // Called when a error has occured
        log('[error] ', args);
    }
}
});
});
</script>

In the upload.php file I have pretty much the default settings >>

<?php
/**
 * upload.php
 *
 * Copyright 2009, Moxiecode Systems AB
 * Released under GPL License.
 *
 * License: http://www.plupload.com/license
 * Contributing: http://www.plupload.com/contributing
 */

// HTTP headers for no cache etc
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

// Settings
$targetDir = ini_get("upload_tmp_dir") . DIRECTORY_SEPARATOR . "plupload";
//$targetDir = 'uploads';

$cleanupTargetDir = true; // Remove old files
$maxFileAge = 5 * 3600; // Temp file age in seconds

// 5 minutes execution time
@set_time_limit(5 * 60);

// Uncomment this one to fake upload time
// usleep(5000);

// Get parameters
$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0;
$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : '';

// Clean the fileName for security reasons
$fileName = preg_replace('/[^\w\._]+/', '_', $fileName);

// Make sure the fileName is unique but only if chunking is disabled
if ($chunks < 2 && file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName)) {
    $ext = strrpos($fileName, '.');
    $fileName_a = substr($fileName, 0, $ext);
    $fileName_b = substr($fileName, $ext);

    $count = 1;
    while (file_exists($targetDir . DIRECTORY_SEPARATOR . $fileName_a . '_' . $count . $fileName_b))
        $count++;

    $fileName = $fileName_a . '_' . $count . $fileName_b;
}

$filePath = $targetDir . DIRECTORY_SEPARATOR . $fileName;

// Create target dir
if (!file_exists($targetDir))
    @mkdir($targetDir);

// Remove old temp files    
if ($cleanupTargetDir && is_dir($targetDir) && ($dir = opendir($targetDir))) {
    while (($file = readdir($dir)) !== false) {
        $tmpfilePath = $targetDir . DIRECTORY_SEPARATOR . $file;

        // Remove temp file if it is older than the max age and is not the current file
        if (preg_match('/\.part$/', $file) && (filemtime($tmpfilePath) < time() - $maxFileAge) && ($tmpfilePath != "{$filePath}.part")) {
            @unlink($tmpfilePath);
        }
    }

    closedir($dir);
} else
    die('{"jsonrpc" : "2.0", "error" : {"code": 100, "message": "Failed to open temp directory."}, "id" : "id"}');


// Look for the content type header
if (isset($_SERVER["HTTP_CONTENT_TYPE"]))
    $contentType = $_SERVER["HTTP_CONTENT_TYPE"];

if (isset($_SERVER["CONTENT_TYPE"]))
    $contentType = $_SERVER["CONTENT_TYPE"];

// Handle non multipart uploads older WebKit versions didn't support multipart in HTML5
if (strpos($contentType, "multipart") !== false) {
    if (isset($_FILES['file']['tmp_name']) && is_uploaded_file($_FILES['file']['tmp_name'])) {
        // Open temp file
        $out = fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");
        if ($out) {
            // Read binary input stream and append it to temp file
            $in = fopen($_FILES['file']['tmp_name'], "rb");

            if ($in) {
                while ($buff = fread($in, 4096))
                    fwrite($out, $buff);
            } else
                die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');
            fclose($in);
            fclose($out);
            @unlink($_FILES['file']['tmp_name']);
        } else
            die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
    } else
        die('{"jsonrpc" : "2.0", "error" : {"code": 103, "message": "Failed to move uploaded file."}, "id" : "id"}');
} else {
    // Open temp file
    $out = fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");
    if ($out) {
        // Read binary input stream and append it to temp file
        $in = fopen("php://input", "rb");

        if ($in) {
            while ($buff = fread($in, 4096))
                fwrite($out, $buff);
        } else
            die('{"jsonrpc" : "2.0", "error" : {"code": 101, "message": "Failed to open input stream."}, "id" : "id"}');

        fclose($in);
        fclose($out);
    } else
        die('{"jsonrpc" : "2.0", "error" : {"code": 102, "message": "Failed to open output stream."}, "id" : "id"}');
}

// Check if file has been uploaded
if (!$chunks || $chunk == $chunks - 1) {
    // Strip the temp .part suffix off 
    rename("{$filePath}.part", $filePath);
}


// Return JSON-RPC response
die('{"jsonrpc" : "2.0", "result" : null, "id" : "id"}');

?>

Answer

Manoj picture Manoj · Sep 12, 2012

Check for the 777 permissions for your upload folder. AS per readme file in plupload suggests you need HTML5 and flash support