Javascript 用于AJAX文件上载的Multipart还是base64?

Javascript 用于AJAX文件上载的Multipart还是base64?,javascript,jquery,ajax,ember.js,Javascript,Jquery,Ajax,Ember.js,我正在用EmberJS编写一个单页应用程序,需要上传一些文件 我写了一个特殊的视图,它包装文件输入字段并提取第一个选定的文件。这使我可以将文件-对象绑定到模型属性 现在我必须做出选择 我可以编写一个特殊的文件转换,将文件-对象序列化为base64,然后简单地将其放入/发布 或者我可以截取RESTAdapter方法createRecord和updateRecord来检查每个模型中的文件-对象,并将PUT/POST请求切换到多部分/表单数据,并在表单数据的帮助下发送它 这些方向中有一个会带来重大问题

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

我写了一个特殊的视图,它包装文件输入字段并提取第一个选定的文件。这使我可以将
文件
-对象绑定到模型属性

现在我必须做出选择

我可以编写一个特殊的文件转换,将
文件
-对象序列化为base64,然后简单地将其放入/发布

或者我可以截取
RESTAdapter
方法
createRecord
updateRecord
来检查每个模型中的
文件
-对象,并将PUT/POST请求切换到
多部分/表单数据
,并在
表单数据
的帮助下发送它


这些方向中有一个会带来重大问题吗?

我不得不评估我正在开发的Restful API的相同问题。在我看来,最理想的方法是对base64编码的数据使用RESTAdapter

也就是说,在我的例子中,我必须使用multipart/formdata方法,因为当您对文件数据进行base64编码时,数据传输要高出30%。由于我的API必须接受大型(100MB+)文件,因此我选择使用API的POST方法来接收多部分表单数据,其中文件和json数据是POST变量之一


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

对于我正在开发的Restful API,我不得不考虑同样的问题。在我看来,最理想的方法是对base64编码的数据使用RESTAdapter

也就是说,在我的例子中,我必须使用multipart/formdata方法,因为当您对文件数据进行base64编码时,数据传输要高出30%。由于我的API必须接受大型(100MB+)文件,因此我选择使用API的POST方法来接收多部分表单数据,其中文件和json数据是POST变量之一


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

对于我正在开发的Restful API,我不得不考虑同样的问题。在我看来,最理想的方法是对base64编码的数据使用RESTAdapter

也就是说,在我的例子中,我必须使用multipart/formdata方法,因为当您对文件数据进行base64编码时,数据传输要高出30%。由于我的API必须接受大型(100MB+)文件,因此我选择使用API的POST方法来接收多部分表单数据,其中文件和json数据是POST变量之一


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

对于我正在开发的Restful API,我不得不考虑同样的问题。在我看来,最理想的方法是对base64编码的数据使用RESTAdapter

也就是说,在我的例子中,我必须使用multipart/formdata方法,因为当您对文件数据进行base64编码时,数据传输要高出30%。由于我的API必须接受大型(100MB+)文件,因此我选择使用API的POST方法来接收多部分表单数据,其中文件和json数据是POST变量之一


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

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

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);
},
filesdichange:function(){
//获取文件列表
var$input=this.$('input'),
fileList=$input.get(0).files;
//迭代文件
对于(var i=0;i
我自己也遇到了这个问题,最后使用
FormData
对象使用了一个简单的jQuery AJAX调用。我的multi-select实现(一次可以删除多个文件)如下所示:

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);
},
filesdichange:function(){
//获取文件列表
var$input=this.$('input'),
fileList=$input.get(0).files;
//迭代文件
对于(var i=0;i
我自己也遇到了这个问题,最后使用
FormData
对象使用了一个简单的jQuery AJAX调用。我的multi-select实现(一次可以删除多个文件)如下所示:

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);
},
filesdichange:function(){
//获取文件列表
var$input=this.$('input'),
fileList=$input.get(0).files;
//迭代文件
对于(var i=0;i