在服务器端处理 plupload 的分块上传

Posted

技术标签:

【中文标题】在服务器端处理 plupload 的分块上传【英文标题】:Handling plupload's chunked uploads on the server-side 【发布时间】:2012-02-19 03:13:32 【问题描述】:

当我使用 plupload 来分块文件(设置选项chunk_size)时,我会为每个块获得一个单独的 php 请求。查看$_FILES 变量,每个块的类型为"application/octet-stream"

有没有什么简单、标准和舒适的方法可以在服务器端将这些部分组合到 PHP 中?

保证理智(例如,当其中一件丢失时等)。

【问题讨论】:

【参考方案1】:

这是解析块的方法,并将结果存储在 $upload_file 中(更改 $uploaded_file 以匹配您的需要)。

    $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"';
        
    

【讨论】:

谢谢克里斯。这是您通常用于此目的的代码吗?使用 plupload 或其他库? 我将它与 plupload flash 组件一起使用。它应该与所有使用块的 plupload 兼容。 Kris,但我在 $_POST 请求中没有任何 unique_id。你能告诉我你是如何设置 plupload 对象的吗?你用multipart: true吗?【参考方案2】:

最后我使用了与 plupload-1.5.2 (examples/upload.php) 捆绑的官方示例中的代码:

http://github.com/moxiecode/plupload/blob/master/examples/upload.php

【讨论】:

对不起。但这对我不起作用...任何其他选择...谢谢

以上是关于在服务器端处理 plupload 的分块上传的主要内容,如果未能解决你的问题,请参考以下文章

plUpload - 服务器端错误未显示

使用 plupload 和 Rails 3 的 Amazon S3 分段上传

使用 html5 分块上传文件

Laravel + Plupload 上传到 S3 响应以进行预检无效 - CORS

SpringBoot实现浏览器端大文件分块上传

Plupload 错误 -200 HTTP 错误