【问题标题】:Blueimp jQuery File Upload plugin - "Empty file upload" result PHPBlueimp jQuery 文件上传插件 - “空文件上传”结果 PHP
【发布时间】:2012-12-18 23:40:29
【问题描述】:

这是插件: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 中找不到任何东西。感谢您的帮助。

【问题讨论】:

  • 这方面有什么进展吗?我遇到了类似的问题(使用 CodeIgniter 设置)。
  • 还没有,暂时搁置了。如果再试一次,我一定会在这里更新。

标签: php jquery jquery-plugins blueimp


【解决方案1】:

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

所以你只需要调整你的上传类:

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

你已经完成了

【讨论】:

    【解决方案2】:

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

        {"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.

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

    【讨论】:

      【解决方案3】:

      在向

      HTML 标签之外的模板添加 HTML(以及在程序化结果 DOM 中)对象时,将出现“空文件上传结果”,例如:假设您在模板中添加另一个

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

      好像要跟JS模板引擎做点什么。

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

      原码:

          // 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();
      

      希望这对其他人有帮助:)

      【讨论】:

        【解决方案4】:

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

        查看函数 post(),编辑这一行

        $json = json_encode($info);
        

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

        我还必须在函数的最后一行编辑回声;而不是

        echo $json;
        

        现在有

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

        返回正确的 json 数组似乎可以正常工作。希望对您有所帮助。

        【讨论】:

          【解决方案5】:

          就我而言,我修改了 jquery.fileupload-ui.js 文件以直接查找 JSON 结果。

          改变这个sn-p

            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 () {

          到这里

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

          【讨论】:

            【解决方案6】:

            如前所述,发生这种情况是因为服务器响应不是插件所期望的(这是一个文件数组as shown here)。 如果您不想(或不能)更改后端,解决方案是将响应中的结果对象替换为插件期望的结果对象(然后包含文件数组)。

            这可以在 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 插件解析的新对象替换 result 对象,让我们定义它(注意:这是一个包含文件数组的对象,根据插件文档)。

            //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 架构,并且您不会再收到“空文件上传结果”消息。

            【讨论】:

              【解决方案7】:

              对我来说,这是上传文件的大小。 我调整了那些 php.ini 参数:

              • memory_limit
              • post_max_size
              • upload_max_filesize
              • max_file_uploads

              【讨论】:

              • 请添加更多详细信息以扩展您的答案,例如工作代码或文档引用。
              • @Community 如果您遇到“空文件上传”错误,请更改我提到的变量的值(memory_limit、post_max_size、upload_max_filesize、max_file_uploads)。提升他们的价值观
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2013-04-14
              • 2013-02-13
              • 2016-07-25
              • 1970-01-01
              • 2015-03-05
              • 2014-02-06
              相关资源
              最近更新 更多