【问题标题】:File upload twice to different servers?文件上传两次到不同的服务器?
【发布时间】:2014-12-29 23:48:55
【问题描述】:

我想制作两个 jQuery 文件上传处理程序 - 一个到 server1,另一个到 server2。像这样的:

$('#fileupload').fileupload({
              url: 'server1',
              type: 'POST',
              autoUpload: true,
              formData: {
                  ....
              }
          })

$('#fileupload').fileupload({
                              url: 'server2',
                              type: 'POST',
                              autoUpload: true,
                              disableImageResize: false,
                              imageMaxWidth: 200,
                              imageMaxHeight: 200
                          })

但是,当我这样做时,只有第二个处理程序被调用,因此只有第二个服务器接收文件。如何让两台服务器都接收文件?

更新:

有些人指出这些调用是异步的,这是真的 - 但回调方法也不起作用,这就是我需要帮助的原因:

$('#fileupload').fileupload({
                  url: 'server1',
                  type: 'POST',
                  autoUpload: true,
                  formData: {
                      ....
                  }
              }).on('fileuploadstop', function(){

                             $('#fileupload').fileupload({
                                  url: 'server2',
                                  type: 'POST',
                                  autoUpload: true,
                                  disableImageResize: false,
                                  imageMaxWidth: 200,
                                  imageMaxHeight: 200
                              })
});

编辑 2

我仍在努力解决这个问题 - 我越来越接近了,但我还没有完全明白。

我的目标是当用户添加一个文件时,它会被上传到一个服务器,然后立即以不同的设置上传到另一台服务器。

这是最近的一个实现——第一次可以工作,但第二次对两个服务器都有多次调用。看来,即使我只初始化 fileupload() 一次(使用互斥锁)并小心在第二次调用中取消设置我的生命周期回调,下次有人上传文件时它仍然会双重触发。有什么想法吗?

  <form id="form_file_upload" action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" id="fileupload" name="file" multiple>
    <input type="submit" value="Upload">
  </form>

$(function() {
  $('#fileupload').on('change', function(){
      var fileUploadAddFn = function (e, data) {
          // lifecycle callback
          // do stuff
      };

      var fileSetupFirstUpload = function (){
          $('#fileupload').fileupload( // initialize first server
                  'option',
                  {
                      url: 'server1',
                      type: 'POST'
                  }
          );
          $('#fileupload').on('fileuploadaddfn', fileUploadAddFn); // set a lifecycle callback for 1st upload
      };

      var fileSetupSecondUpload = function() {
          $('#fileupload').fileupload( // initialize first server
                  'option',
                  {
                      url: 'server2',
                      type: 'POST'

                  }
          );
          $('#fileupload').off('fileuploadaddfn');
          $('#fileupload').off('fileuploadstop');
      }

      var filesToUpload = $('#fileupload')[0].files; // this works since fileupload is not yet initialized
      if(typeof fileUploadInitialized == 'undefined'){
          $('#fileupload').fileupload();
          fileUploadInitialized = true; // global mutex to only initialize once
      }

      fileSetupFirstUpload();
      $('#fileupload').on('fileuploadstop', function (e, data) {
        fileSetupSecondUpload();
        $('#fileupload').fileupload('add', {files: filesToUpload});
        $('#fileupload').fileupload('send');
      });

      $('#fileupload').fileupload('add', {files: filesToUpload});
      $('#fileupload').fileupload('send');
  });

【问题讨论】:

  • 这些电话是asynchronous。第二个可能在第一个完成之前开始,覆盖它。
  • 第一次上传完成后,通过第一次的回调触发第二次
  • @NicholasKyriakides 我也尝试过这种方法,但似乎没有用
  • 是否可以上传到单个PHP文件,这样用户只需上传一次文件……那么,PHP文件可以将文件上传到第二台服务器吗?之后,PHP 文件可以返回一个带有回调数据的 JSON 字符串吗?

标签: jquery html jquery-file-upload


【解决方案1】:

试试

$('#fileupload').fileupload(); // init
$("#fileupload").on("change", function (e) {
    e.preventDefault();
    // `File` object reference
    var file = e.target.files[0];
    // settings
    var settings = [{
        "files": file,
        "url": "/echo/json/" // `server1`
        //, additional settings
    }, {
        "files": file,
        "url": "/echo/json/" // `server2`
        //, additional settings
    }];
    var request = function (_settings) {
        var jqxhr = $('#fileupload').fileupload('send', _settings);
        return jqxhr
    };

    $.when.apply($(e.target), // set `this`
        $.map(settings, function (data) {
            return request(data)
            .success(function (result, textStatus, jqXHR) {
                // do stuff ,
                // return promise to `then`
                return jqXHR
            })
            .error(function (jqXHR, textStatus, errorThrown) {
                console.log(errorThrown);
                return errorThrown // return `errorThrown` to `then`
            })
            .complete(function (result, textStatus, jqXHR) {
                /* ... */
            });
        })
    ).then(function (upload1, upload2) {
        console.log(upload1, upload2, this) // `this` : `$("#fileupload")`
    }, function (err) {
        console.log(err)
    });

});

jsfiddle http://jsfiddle.net/guest271314/8hms1t4k/

【讨论】:

  • 这似乎有效,但是作为我的“设置”对象的一部分,我想为每个服务器指定不同的 imageMaxHeight 和 imageMaxWidth。通常,当您初始化 fileupload() 并传递这些设置时,它会在实际发送文件之前处理这些调整大小操作。知道如何使用您的代码使设置与图像大小一起使用吗?
  • 试过在settings对象中包含imageMaxHeightimageMaxWidth属性?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-08
  • 2010-10-15
相关资源
最近更新 更多