如何将Dropzone.js上传的分块文件与PHP连接起来?

如何将Dropzone.js上传的分块文件与PHP连接起来?,php,jquery,file-upload,dropzone.js,chunking,Php,Jquery,File Upload,Dropzone.js,Chunking,我使用Dropzone.js获取各种类型的文件(包括图像和非图像,如PDF),并将它们以1mb的块上传到我们的服务器。然后我尝试用PHP连接这些文件,然后将它们上传到我们公司的FileMaker数据库 到目前为止,我已经能够得到文件上传在块,因为他们应该。我将它们都存储在一个临时的“uploads”文件夹中,并使用相同的“代码名”,在每个名称的末尾附加“-INDEX#”(INDEX#是Dropzone传递的正在上载的块) 我已经隔离了PHP的失败部分,该部分通过已经上传的块循环获取内容。具体地说

我使用Dropzone.js获取各种类型的文件(包括图像和非图像,如PDF),并将它们以1mb的块上传到我们的服务器。然后我尝试用PHP连接这些文件,然后将它们上传到我们公司的FileMaker数据库

到目前为止,我已经能够得到文件上传在块,因为他们应该。我将它们都存储在一个临时的“uploads”文件夹中,并使用相同的“代码名”,在每个名称的末尾附加“-INDEX#”(INDEX#是Dropzone传递的正在上载的块)

我已经隔离了PHP的失败部分,该部分通过已经上传的块循环获取内容。具体地说,当我去获取内容时,我试图通过使用PHP的“realpath”将块的文件路径保存到一个变量,以获得绝对路径,并作为文件存在性的真/假检查。毫无疑问,PHP无法“查看”该文件

我不是文件夹权限方面的专家,所以很有可能与此相关,我只是不知道如何处理它。您将看到,我确实在uploads/目录的PHP顶部尝试了chmod

我只包含了下面的PHP代码,没有任何javascript。我不确定JS是否相关,因为它显然可以很好地处理实际的块上传

下面的PHP文件与uploads/文件夹位于同一目录中,块将在该目录中结束


我想出来了!问题是我试图在$chunkIndex==$chunkTotal时调用连接循环。如果您查看浏览器网络监视器,您将看到块通常以错误的顺序上载,这将导致realpath步骤上的连接失败,因为该文件实际上还不存在(几秒钟后我访问实际文件夹时的情况就是如此)。为了证明这一点,只需尝试sleep(5)来给剩余的时间来上传,并看到它成功(当然这是一个糟糕的解决方案,但是一个快速测试)

解决方案是将上传脚本与连接脚本分开。如果您使用的是Dropzone.js,则可以从“chunksupload”触发连接脚本,如以下链接所述:

您可以在下面看到最终脚本的外观:

script.js

var myDropzone = new Dropzone(target, {
  url: ($(target).attr("action")) ? $(target).attr("action") : "../../chunk-upload.php", // Check that our form has an action attr and if not, set one here
  maxFilesize: 25, // megabytes
  chunking: true,
  parallelUploads: 1,
  parallelChunkUploads: true,
  retryChunks: true,
  retryChunksLimit: 3,
  forceChunking: true,
  chunkSize: 1000000,
  acceptedFiles: "image/*,application/pdf,.doc,.docx,.xls,.xlsx,.csv,.tsv,.ppt,.pptx,.pages,.odt,.rtf,.heif,.hevc",
  previewTemplate: previewTemplate,
  previewsContainer: "#previews",
  clickable: true,
  autoProcessQueue: false,
  chunksUploaded: function(file, done) {
    // All chunks have been uploaded. Perform any other actions
    let currentFile = file;

    // This calls server-side code to merge all chunks for the currentFile
    $.ajax({
        url: "chunk-concat.php?dzuuid=" + currentFile.upload.uuid + "&dztotalchunkcount=" + currentFile.upload.totalChunkCount + "&fileName=" + currentFile.name.substr( (currentFile.name.lastIndexOf('.') +1) ),
        success: function (data) {
            done();
        },
        error: function (msg) {
            currentFile.accepted = false;
            myDropzone._errorProcessing([currentFile], msg.responseText);
        }
     });
  },

});
chunk upload.php


天啊,这帮我省去了很多工作,只是在后勤上乱搞。。。能够在半天内将临时系统固定到位。谢谢这很有帮助!但是,我必须稍微修改您在每个文件中发送文件名的方式。有时您只发送文件扩展名而不发送完整文件名,这导致realpath返回false。我可以在哪里发布编辑的代码?我真的不想发布我的答案,因为你的答案已经足够了。我很高兴向您发送我对该论坛的编辑。我是否必须提高max_post_大小和max_upload_大小,以允许上载连接的文件大于当前配置的值?