1

我正在构建一个基于 Cordova/PhoneGap 的 Web 应用程序,它使用 multipart/form-data POST 请求将文件上传到服务器。

以下代码适用于 BlackBerry 10:

var postRequest = new XMLHttpRequest();
if (postRequest.overrideMimeType) {
    postRequest.overrideMimeType('text/xml');
}
var fd = new FormData();
fd.append('param1', 'value1');
[...]
fd.append('file', file, fileName);
postRequest.open('POST', url, true);
postRequest.send(fd);

然而,在运行 iOS6 的 iPhone 上,该File对象在发送到服务器时被 [Object object] 替换String,类似于Safari 在将 File 插入 FormData 时将文件转换为 [object Object] 中描述的问题。怎么修?.

与该问题相反,我没有克隆 File 对象。我的应用程序通过“打开方式...”菜单使用来自其他应用程序的文档进行调用。我传递了一个本地文件系统 URI,我使用window.resolveLocalFileSystemURI(). 这完美地工作,我首先收到一个 FileEntry 和一个 File 对象。但是,似乎无法正确识别此对象,toString()而是在将请求传输到服务器时调用其方法。

这是iOS上的错误吗?或者在创建 File 对象时可能是 PhoneGap 中的错误?最好的解决方法是什么?

更新:我刚刚在 Android 上遇到了同样的问题,所以这个问题似乎并不特定于 iOS。

4

1 回答 1

1

iOS 的一种可能的解决方法似乎是使用 FileReader 读取文件,从中构造一个新的 Blob 对象,然后将其传输到服务器:

var reader = new FileReader();
reader.onloadend = function(evt) {
     var fileBlob = new Blob([evt.target.result], { 'type' : fileType });
};
reader.readAsArrayBuffer(file);

此处使用的 Blob 构造函数需要 iOS 6.0 或更高版本。这样,数据就按预期完全传输到服务器。

也可以使用 WebKitBlobBuilder 在 Android 上创建 Blob。不幸的是,在我的测试期间,这并没有解决 Android 上的问题。

于 2013-05-28T12:59:41.750 回答