Blueimp jQuery文件上传插件 – “空文件上传”结果PHP

这是插件: https : //github.com/blueimp/jQuery-File-Upload

我在上传文件后从插件中获取我想要的响应时遇到问题。

在包含插件的页面上,我有以下内容

$('#fileupload').fileupload( 'option', { 'maxNumberOfFiles' :1, 'url' : '/admin/upload_handler.php' } ); 

upload_handler.php我成功从$ _FILES中检索上传的文件并执行操作,然后以JSON格式发回响应。 我已经确认使用Firebug,响应格式正确:

 [ { "url" : "image_url", "thumbnail_url" : "image_th_url", "delete_url" : "test", "delete_type" : "DELETE", "name" : "foobar.jpg", "size" : 7419 } ] 

但回调找不到文件数组,我收到错误:’空文件上传结果’。 我觉得我在这里缺少一些关键的东西 – 我在文档,论坛或Stack Overflow中找不到任何东西。 我感谢任何帮助。

从插件版本5开始,json响应发生了变化: https : //github.com/blueimp/jQuery-File-Upload/wiki/JSON-Response

所以你只需调整你的上传课程:

 $filejson = new stdClass(); $filejson->files[] = $fileArray; return json_encode($filejson); 

而且你已经完成了

您的返回需要包含在文件数组中,如下所示:

  {"files": [ { "name": "picture1.jpg", "size": 902604, "url": "http:\/\/example.org\/files\/picture1.jpg", "thumbnailUrl": "http:\/\/example.org\/files\/thumbnail\/picture1.jpg", "deleteUrl": "http:\/\/example.org\/files\/picture1.jpg", "deleteType": "DELETE" }, { "name": "picture2.jpg", "size": 841946, "url": "http:\/\/example.org\/files\/picture2.jpg", "thumbnailUrl": "http:\/\/example.org\/files\/thumbnail\/picture2.jpg", "deleteUrl": "http:\/\/example.org\/files\/picture2.jpg", "deleteType": "DELETE" } ]} 

特别是,要求是: Note that the response should always be a JSON object containing a files array even if only one file is uploaded.

via :: https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#using-jquery-file-upload-ui-version-with-a-custom-server-side-upload-handler

将HTML(和程序结果DOM)对象添加到

HTML标记之外的模板时,会出现“空文件上载结果”,例如:假设您添加另一个< tr>到模板

这将导致文件正确上传,并且对于每个上传的文件,您将获得一次“空文件上载结果”。

似乎必须对JS模板引擎做一些事情。

这可以在第128行之后的jquery.fileupload-ui,js中修复

原始代码:

  // Callback for successful uploads: done: function (e, data) { var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload'), files = that._getFilesFromResponse(data), template, deferred; if (data.context) { data.context.each(function (index) { // LINE 128 var file = files[index] || {error: 'Empty file upload result'}, deferred = that._addFinishedDeferreds(); 

在第128行之后添加以下代码:

 if (!$(data.context[index]).hasClass(that.options.uploadTemplateId)) { return true; } 

结果代码:

  // Callback for successful uploads: done: function (e, data) { var that = $(this).data('blueimp-fileupload') || $(this).data('fileupload'), files = that._getFilesFromResponse(data), template, deferred; if (data.context) { data.context.each(function (index) { //LINE 128 if (!$(data.context[index]).hasClass(that.options.uploadTemplateId)) { return true; } // YOUR ADDED LINE var file = files[index] || {error: 'Empty file upload result'}, deferred = that._addFinishedDeferreds(); 

希望这有助于其他人:)

好吧,这似乎不是一个jQuery问题,而是一个服务器端问题。 在我的例子中,它是一个PHP脚本,需要调整如下。

请参阅函数post(),编辑此行

 $json = json_encode($info); 

 $json = json_encode(array($this->options['param_name'] =>$info)); 

我还必须在函数的最后一行编辑回声; 代替

 echo $json; 

现在有

 echo str_replace('\/','/',$json); 

它似乎工作正常返回正确的json数组。 希望能帮助到你。

在我的情况下,我修改了jquery.fileupload-ui.js文件以直接查找JSON结果。

更改此代码段

  if (data.context) { data.context.each(function (index) { var file = files[index] || {error: 'Empty file upload result'};//CHANGE deferred = that._addFinishedDeferreds(); that._transition($(this)).done( function () { 

如前所述,这是因为服务器响应不是插件所期望的(这是一个如下所示的文件数组)。 如果您不(或不能)想要更改后端,则解决方案是将响应中的结果对象替换为插件期望的结果对象(然后包含files数组)。

这可以在fileuploaddone事件中完成。

我们假设这是上传完成后从服务器返回的JSON响应: 在此处输入图像描述

data.result保存服务器响应:

 .bind('fileuploaddone', function(e, data) { //this will now contains the server response //as per the attached image: an array of elements data.result; }); 

我们想用一个可以被blueimp插件解析的新结果替换结果对象,让我们定义它(注意:这是一个包含文件数组的对象,根据插件文档)。

 //tempFolder is optional var filesUploaded = { "files": [], "tempFolder": null }; 

替换结果对象:

 .bind('fileuploaddone', function(e, data) { //creating a file object in the format the jquery plugin is expecting var file = { deleteType: "DELETE", deleteUrl:"#", type: data.result[0].MimeType, thumbnailUrl : "#", url: "#", name: data.result[0].Name, size: data.result[0].Size } //adding it to the file list filesUploaded.files.push(file); data.result = null; //replacing the server response with the 'custom' one we just created data.result = filesUploaded; }); 

该插件现在应该呈现正常,因为它将解析预期的JSON模式,您将不再获得“空文件上载结果”消息。