我正在使用适用于iOS 4.3的Appcelerator SDK 1.6.2进行开发
我正在尝试将多个文件上传到服务器,问题是文件的数量是动态的,因此无法在XHR发送的参数中预先确定。
如果我传入一个文件,它工作正常,但我似乎无法弄清楚如何传递许多。
我已经尝试创建一个数组来保存媒体元素,但没有骰子。
var media = [];
for(var i = 0; i < sync.images.length; i++){
media[i] = Titanium.Filesystem.getFile(sync.images[i].path).read();
}
xhr.send({
media: media // no workie
// media: media[1] workie
});
我找到了这篇文章:http://developer.appcelerator.com/question/123794/multiple-file-upload-in-one-request
假设以下代码应该起作用:
xhr.send({
'media[]': imageFile.read(),
'media[]': imageFile2.read()
});
然而,我不确定如何动态获得这个,因为传输的图像数量可能会有所不同
建议会很棒
我遇到了这个问题,最后我使用了Object.defineProperty方法。以下是您的代码的修改方式:
将媒体更改为对象而不是数组,然后迭代定义属性:
var media = {};
for(var i = 0; i < sync.images.length; i++){
data_blob = Titanium.Filesystem.getFile(sync.images[i].path).read();
data_key = 'image'+i;
Object.defineProperty(media, data_key, {value: data_blob, enumerable: true});
}
xhr.send(media);
这是defineProperty的mozilla文档:
你想在POST参数中使用xhr,所以xhr.open("POST", url);
第二,尝试不同对象索引中的每个文件,例如:
{
file1: imageFile.read(),
file2: imageFile2.read()
}
要抓住PHP,只需要做$_FILE['file1'], $_FILE['file2']
...等。
我也遇到了这个问题,目前明确的答案对我不起作用。经过一些调试后,我找到了更好的解决方案。
首先设置参数(注意:如果您不需要额外的键/值,请保留{})。
var parameters = {'extraKey': 'extraValue'};
之后循环遍历您的文件并将它们添加到参数中。
for(var i in files) parameters['files[' + i +']'] = files[i];
循环后,您的参数将如下所示:
{'extraKey':'extraValue', 'file[0]': files[0], 'file[1]': files[1] }
现在你可以发送它们像xhr.send(parameters);
已经晚了5年但是嘿我也来了这里^^。