32

IE 8/9 中不存在FormData ,但我需要这些浏览器中的该功能。有一个很好的后备方案吗?

我会尝试通过 json 数据发送,但我需要将文件传递给服务器。我将此文件附加到formData现代浏览器中,然后提交一个XHR请求。因为FormData在 IE 8/9 中不存在这显然失败了。

// I cant seem to get this to work with a file.
$.ajax({
    url: '/genericHandlers/UploadDocsFile.ashx',
    type: "POST",
    data: model.toJSON(),
    contentType: 'application/json'
    }).done(function  (data) { 
       log('stuff happened!');
    });

也许另一种方法是在 js 中创建一个假表单对象,然后将数据附加到该对象?

4

3 回答 3

8

我只知道一种可能的解决方案,但这并不是 IE 真正的 1-1 后备方案。没有可能用于发送文件的通信 API,因为您无法在旧浏览器中绑定输入字段,例如在使用 FormData 的现代浏览器中。但是您可以使用 iframe 发送整个表单。对于这种情况,您可以使用支持 XHR DataForm 和 iframe 的jquery.form插件(当浏览器不支持 FormData API 时,数据使用 iframe 发送)。

于 2012-08-05T06:57:21.467 回答
4

您可以使用 XMLHttpRequests 手动发送文件,这里有很多信息

您可以测试浏览器是否可以FormData首先使用该对象:

if(typeof FormData !== 'undefined')
   ...

MDN 有一个this 函数,你可以修改它作为后备:

var XHR = new XMLHttpRequest();
var urlEncodedData = "";
var urlEncodedDataPairs = [];
var name;

// We turn the data object into an array of URL encoded key value pairs.
for(name in data) {
  urlEncodedDataPairs.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
}

// We combine the pairs into a single string and replace all encoded spaces to 
// the plus character to match the behaviour of the web browser form submit.
urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');
于 2014-08-05T15:25:25.107 回答
0

此答案并未严格解决您提出的问题,因此我了解 Mods 是否会删除它。

但是,您的问题与我正在研究的一个问题密切相关,即如何通过 FormData() 提供拖放上传,并为旧浏览器提供优雅降级

有一个很棒的库叫做dropzone.js,它为我的问题提供了一个完美的解决方案。也许最好的部分是该库提供了开箱即用的优雅降级以支持旧浏览器上的文件上传,详见此处

转述来源:

幸运的是,如果不支持浏览器,dropzone.js 库会显示一个可自定义的后备类,其中包含一个输入字段和一个提交按钮。

我希望这些信息可以帮助像我一样正在寻找一种简单易用且优雅的文件上传解决方案的人。

于 2018-10-04T16:20:24.393 回答