用于AJAX文件上传的Multipart或base64?

时间:2014-11-18 01:00:11

标签: javascript jquery ajax ember.js

我正在用EmberJS编写单页应用程序,需要上传一些文件。

我写了一个特殊的视图,它包装文件输入字段并提取所选的第一个文件。这允许我将File - Object绑定到模型属性。

现在我必须选择。

我可以编写一个特殊的文件转换,将File - 对象序列化为base64,然后简单地PUT / POST。

或者我可以截取RESTAdapter方法createRecordupdateRecord来检查File - 对象的每个模型,并将PUT / POST请求切换为multipart/form-data并在FormData

的帮助下发送

其中一个方向是否存在重大问题?

2 个答案:

答案 0 :(得分:1)

我必须对我正在开发的Restful API评估同样的问题。在我看来,最理想的方法是将RESTAdapter与base64编码数据一起使用。

话虽这么说,我必须在我的情况下使用multipart / form-data方法,因为当你对文件数据进行base64编码时,数据传输会高出30%。由于我的API必须接受大型(100MB +)文件,因此我选择使用API​​的POST方法来接收多部分表单数据,其中文件和json数据是POST变量之一。

因此,除非您需要像我的情况一样上传大文件,否则我建议您始终坚持使用REST方法。

答案 1 :(得分:1)

我自己遇到了这个问题,最后使用FormData对象使用了一个简单的jQuery AJAX调用。我的多选实现(一次可以删除多个文件)如下所示:

filesDidChange: function() {
  // Get FileList
  var $input = this.$('input'),
      fileList = $input.get(0).files;

  // Iterate files
  for (var i = 0; i < fileList.length; i++) {
    var file = fileList[i],
      formData = new FormData();

    // Append information to FormData instance
    formData.append('attachment[title]', file.name);
    formData.append('attachment[file]', file);
    formData.append('attachment[post_id]', this.get('post.id'));

    // Send upload request
    Ember.$.ajax({
      method: 'POST',
      url: '/attachments',
      cache: false,
      contentType: false,
      processData: false,
      data: formData,
      success: makeSuccessHandler(this),
      error: makeErrorHandler(this)
    });
  }

  // Notify
  this.container.lookup('util:notification').notify('Uploading file, please wait...');

  // Clear FileList
  $input.val(null);
},