2011-03-01 71 views
10

使用HTML5的File API,通过XMLHttpRequest中的名为upload的对象进行上载。 This是我正在使用的教程(以及Google cache mirror,因为它现在处于关闭状态)。这是有关部分:jQuery等价于XMLHttpRequest的上传?

// Uploading - for Firefox, Google Chrome and Safari 
xhr = new XMLHttpRequest(); 

// Update progress bar 
xhr.upload.addEventListener("progress", function (evt) { 

正如你所看到的,以跟踪上传进度,该XMLHttpRequest对象有一个名为upload属性,我们可以添加一个事件处理程序。

我的问题是:有jQuery的一个等效?。尽管微软认为这是个好主意(虽然听起来像it will be in 2012 or 2013),但我试图尽可能保持代码的清洁和跨浏览器兼容性。

+0

你正在寻找一个jQuery插件或找出jQuery XHR包装器是否支持这种功能? – justkt 2011-03-01 16:46:26

+0

@justkt我正在寻找一个jQuery的内置选项,如果不可用的话,一个插件将会很好。谢谢。 – metrobalderas 2011-03-01 16:52:08

+3

如果您已经在使用HTML5,那么您并没有认真考虑跨浏览器的兼容性,因此只需构建工作内容并发出一条消息,告诉人们使用其中一个工作的浏览器即可。 CSS3也是如此。 – Endophage 2011-03-01 16:52:19

回答

17

这是我想出来解决这个问题。 $ .ajax()调用允许提供回调来生成XHR。我只是在调用请求之前生成一个,设置它,然后创建一个闭包以在$ .ajax()需要它时返回它。如果他们通过jqxhr访问它,它会容易得多,但他们不会。

var reader = new FileReader(); 

reader.onloadend = function (e) { 
    var xhr, provider; 

    xhr = jQuery.ajaxSettings.xhr(); 
    if (xhr.upload) { 
     xhr.upload.addEventListener('progress', function (e) { 
      // ... 
     }, false); 
    } 
    provider = function() { 
     return xhr; 
    }; 

    // Leave only the actual base64 component of the 'URL' 
    // Sending as binary ends up mangling the data somehow 
    // base64_decode() on the PHP side will return the valid file. 
    var data = e.target.result; 
    data = data.substr(data.indexOf('base64') + 7); 

    $.ajax({ 
     type: 'POST', 
     url: 'http://example.com/upload.php', 
     xhr: provider, 
     dataType: 'json', 
     success: function (data) { 
      // ... 
     }, 
     error: function() { 
      // ... 
     }, 
     data: { 
      name: file.name, 
      size: file.size, 
      type: file.type, 
      data: data, 
     } 
    }); 
}; 
reader.readAsDataURL(file); 
+0

这是一个很好的答案,但不得不发送base64编码为数据参数感觉有点错误..但它是一个非常有创意的解决方案,但它不在jQuery核心上。 – metrobalderas 2011-06-15 18:58:13

+1

二进制字符串不保留 - >此行为可以从规范中进行,如[在本答案中]所述[http://stackoverflow.com/a/10073841/938089?xmlhttprequest-multipart-related-post-with-xml -and-图像作为有效载荷)。 'XMLHttpRequest.prototype.sendAsBinary'方法在[here](http://stackoverflow.com/a/9250818/938089)中有介绍。在jQuery中,使用前面的答案,通过'xhr'设置覆盖'.send'方法(参见[这个答案](http://stackoverflow.com/q/4303448?how-to-override-jquerys-use-的-的XMLHttpRequest功能于阿贾克斯))。 – 2012-06-07 08:04:06

1

对于jqXHR(从jQuery的.ajax()调用返回的XMLHttpRequest的超集)documentation不会将更新功能描述为暴露,这并不意味着它不公开。但是,This question似乎表明上传没有公开。答案提供了一种获取本机XMLHttpRequest对象的方法。

在jQuery 1.5之前的版本中,XMLHttpRequest对象直接公开,因此您可以访问浏览器支持的任何功能。用于构建拖放上传器的This tutorial就是这么做的。

搜索jquery html 5 file upload调出this plugin使用HTML 5文件API进行多文件上传,但是此插件目前不能在IE中使用。如果您不想使用HTML 5,而是希望现在支持跨浏览器,那么您可以在jQuery插件网站上查看jQuery的其他插件。