web-dev-qa-db-fra.com

Manipulation des téléchargements de PLUPLOAD sur le côté serveur

Lorsque j'utilise Plupload dans des fichiers chunk (option de réglage chunk_size), Je reçois un fichier séparé PHP pour chaque morceau. En regardant $_FILES variable, chaque morceau est de type "application/octet-stream".

Y a-t-il une manière simple, standard et confortable comment combiner ces pièces dans PHP au côté serveur?

Avec la santé intellectuelle garantie (par exemple, lorsque l'une des pièces est manquante, etc.).

16
TMS

Voici le moyen d'analyser les morceaux et de stocker le résultat en $ upload_file (changer $ uploaded_file_file pour correspondre à ce dont vous avez besoin).

    $uploaded_file = '/tmp/uploadFile.jpg';

    $chunks = isset($_POST["chunks"]) ? $_POST["chunks"] : 0;

    // If we have a chunked operation...
    if ($chunks > 0)
    {
        // Get the chunk number...
        $chunk = isset($_POST["chunk"]) ? $_POST["chunk"] : 0;

        if ($chunk == 0)
        {
           if (!isset($_SESSION['last_chunk']))
           {
              $_SESSION['last_chunk'] = array();
           }
           $_SESSION['last_chunk'][$_POST['unique_id']] = $chunk;
        }
        else
        {
           if ($_SESSION['last_chunk'][$_POST['unique_id']] != $chunk + 1)
           {
                die('{"jsonrpc" : "2.0", "error" : {"code": 192, "message": "Uploaded chunks out of sequence.  Try again."}, "id" : "id"}');
           }
        }

        $tmp_dir = sys_get_temp_dir();

        // We need a unique filename to identify the file...
        $tmp_filename = $tmp_dir.$_POST['unique_id'];

        // If it is the first chunk we have to create the file, othewise we append...
        $out_fp = fopen($tmp_filename, $chunk == 0 ? "wb" : "ab");

        // The file we are reading from...
        $uploaded_file = $_FILES['file']['tmp_name'];
        $in_fp = fopen($uploaded_file, "rb");

        // Copy the chunk that was uploaded, into the file we are uploading...
        while ($buff = fread($in_fp, 4096))
        {
            fwrite($out_fp, $buff);
        }
        fclose($out_fp);
        fclose($in_fp);


        // If we are the last chunk copy the file to the final location and continue on...
        if ($chunk == $chunks - 1)
        {
            copy($tmp_filename, $uploaded_file);
            unset($_SESSION['last_chunk'][$_POST['unique_id']]);
            if (count($_SESSION['last_chunk']) == 0)
            {  
                unset($_SESSION['last_chunk']);
            }
        }
        else
        {
            // Otherwise report the result to the uploader...
            echo'{"jsonrpc" : "2.0", "result" : null, "id" : "id"}';
        }
    }
17
Kris Erickson