如何使用 Dropzone.js 进行分块文件上传(仅限 PHP)?
Posted
技术标签:
【中文标题】如何使用 Dropzone.js 进行分块文件上传(仅限 PHP)?【英文标题】:How do you use Dropzone.js with chunked file uploads (PHP only)? 【发布时间】:2018-10-28 01:13:45 【问题描述】:我可以找到大量关于如何将分块文件上传与各种 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);
);
这里是 PHP(服务器):
foreach ($_POST as $key => $value)
_log('key:' . $key . '; Value:' . $value);
上面的代码没有显示任何内容(_log() 只是将其回显到屏幕并将其记录在文本文件中)。
我查看了发送/接收标头,它只向服务器发送一个调用。
我已验证 Dropzone.js 使用浏览器中的开发人员工具控制台正确设置了文件拖放区。
编辑:这里是分块上传的文档:https://gitlab.com/meno/dropzone/wikis/faq#chunked-uploads
分块上传
Dropzone 提供了分块上传文件的可能性。这 此功能的相关配置选项是:
分块应该设置为true
forceChunking,如果为真,将始终以块的形式发送文件,即使它 只有一块
chunkSize 以字节为单位
parallelChunkUploads,如果为 true,则将上传块 同时
retryChunks,如果为真,库将重试上传一个块,如果它 失败
retryChunksLimit 默认为 3
然后有两个重要的回调。第一个是:params which 可以是一个函数,它首先接收文件、xhr 和块 争论。如果启用了分块,您知道文件只包含 那个文件,而块是保存所有信息的对象 关于当前块。示例:
var chunk = file: file, index: 0, status: Dropzone.UPLOADING, progress: 0.4
请参阅该参数的文档以获取更多信息或查看 默认实现的源代码。
第二个重要的回调是chunksUploaded,它获取文件 完成上传并完成函数作为第二个参数。做 无论您需要在该功能中做什么,告诉服务器 文件上传完成,准备好后调用 done() 函数。
【问题讨论】:
【参考方案1】:我发现我有很多问题。一是我没有使用最新版本的 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,
;
通过删除 params 函数,我得到了默认值。这些值包括块索引和最大块数。
从那里我可以使用以下方法获取 PHP 脚本中的分块文件:
$_FILE['file']['name']
$_FILE['file']['tmp_name']
$_POST['dzchunkindex']
$_POST['dztotalchunkcount']
之后,只需在 PHP 脚本中检查所有上传的文件部分,然后重新组装它们,这在互联网上很容易找到的许多教程中都有处理。
【讨论】:
你能发布你的确切解决方案吗?我正面临 Dropzone 和 NodeJS 的确切问题。 ***.com/questions/50918759/… 大家好,我在使用 java servlet 作为后端时遇到了同样的问题。有人知道如何在java中实现上传代码吗? 您可以发布用于重新组装文件部分的 php 源代码吗? 这里是用于重新组装的 php ***.com/questions/56156402/…以上是关于如何使用 Dropzone.js 进行分块文件上传(仅限 PHP)?的主要内容,如果未能解决你的问题,请参考以下文章