您如何将 Dropzone.js 与分块文件上传一起使用(仅限 PHP)?

Lok*_*are 6 javascript php jquery dropzone.js dropzone

我可以找到大量关于如何使用带有各种 API 和库的分块文件上传的文档,但我无法找到如何仅通过普通 PHP 使用 Dropzone.js 分块文件上传。

文档非常少。我无法在客户端 (JavaScript) 添加除 jQuery 之外的任何库或 API。

我的问题是如何仅在服务器端使用 Dropzone.js 新的分块文件上传功能与 PHP。(客户端代码被赞赏用于设置)。

这是我到目前为止尝试过的代码:客户端 .js 文件:

    var myDropzone = new Dropzone("div#formDiv", 
    {
        url: "uploadform.php",
        params: function (files, xhr, chunk)
        {
            if (chunk)
            {
                return
                {
                    dzUuid=chunk.file.upload.uuid,
                    dzChunkIndex=chunk.index,
                    dzTotalFileSize=chunk.file.size,
                    dzCurrentChunkSize=chunk.dataBlock.data.size,
                    dzTotalChunkCount=chunk.file.upload.totalChunkCount,
                    dzChunkByteOffset=chunk.index * this.options.chunkSize,
                    dzChunkSize=this.options.chunkSize,
                    dzFilename=chunk.file.name;
                };
            }
        },
        method: "post",
        timeout: 600000,
        maxFileSize: 1024,
        parallelUploads: 1,
        chunking: true,
        forceChunking: true,
        chunkSize: 1000000,
        parallelChunkUploads: true,
        retryChunks: true,
        retryChunksLimit: 3,
        chunksUploaded: function (file, done)
        {
            // All chunks have uploaded successfully

        },
        error: function (msg)
        {
            alert(msg.responseText);
        }
});
Run Code Online (Sandbox Code Playgroud)

这是 PHP(服务器):

foreach ($_POST as $key => $value)
{
    _log('key:' . $key . '; Value:' . $value);
}
Run Code Online (Sandbox Code Playgroud)

上面的代码没有显示任何内容(_log() 只是将其回显到屏幕并将其记录在文本文件中)。

我查看了发送/接收标头,它只向服务器发送一个调用。

我已经使用浏览器中的开发人员工具控制台验证了 Dropzone.js 是否正确设置了文件拖放区。

编辑:这是分块上传的文档:https : //gitlab.com/meno/dropzone/wikis/faq#chunked-uploads

分块上传

Dropzone 提供了分块上传文件的可能性。此功能的相关配置选项是:

应设置为 true 的分块

forceChunking,如果为真,将始终以块的形式发送文件,即使它只是一个块

块大小(以字节为单位)

parallelChunkUploads,如果为 true,则块将同时上传

retryChunks,如果为true,如果失败,库将重试上传块

retryChunksLimit 默认为 3

然后是两个重要的回调。第一个是:params,它可以是一个函数,它接收文件、xhr 和块作为第一个参数。如果启用了分块,则您知道文件仅包含该文件,而块是保存有关当前块的所有信息的对象。例子:

var chunk = {
  file: file,
  index: 0,
  status: Dropzone.UPLOADING,
  progress: 0.4
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅该参数的文档或查看默认实现的源代码。

第二个重要的回调是 chunksUploaded,它获取完成上传的文件和 done 函数作为第二个参数。在该函数中执行您需要执行的任何操作,告诉服务器文件已完成上传并在准备好时调用 done() 函数。

Lok*_*are 5

我发现我有很多问题。一是我没有使用最新版本的 Dropzone.js。

另一个是我没有检查 $_FILE 和 $_POST 中的变量和文件部分。

一旦我解决了这些问题,我将 JavaScript 更改为:

    var myDropzone = new Dropzone("div#formDiv", 
    {
        url: "uploadform.php",
        method: "post",
        timeout: 180000,
        maxFileSize: 1024,
        parallelUploads: 1,
        chunking: true,
        forceChunking: true,
        chunkSize: 256000,
        parallelChunkUploads: true,
        retryChunks: true,
        retryChunksLimit: 3,
    };
Run Code Online (Sandbox Code Playgroud)

通过删除 params 函数,我得到了默认值。这些值包括块索引和最大块数。

从那里我可以使用以下命令获取 PHP 脚本中的分块文件:

$_FILE['file']['name']
$_FILE['file']['tmp_name']
$_POST['dzchunkindex']
$_POST['dztotalchunkcount']
Run Code Online (Sandbox Code Playgroud)

之后,只需检查 PHP 脚本中是否有所有正在上传的文件部分,然后重新组装它们,这在互联网上很容易找到的许多教程中都有处理。

  • 您能否发布用于重新组装文件部分的 php 源代码? (2认同)