2

我正在使用适用于 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()
 });

但是我不确定如何动态获取它,因为传输的图像数量可能会有所不同

建议会很棒

4

3 回答 3

2

我遇到了这个确切的问题,我最终使用了 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 文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FObject%2FdefineProperty#Adding_properties_and_default_values

于 2013-09-26T00:13:10.327 回答
1

你想在 POST 参数中使用 xhr,所以xhr.open("POST", url);

其次,尝试不同对象索引中的每个文件,例如:

{
   file1: imageFile.read(),
   file2: imageFile2.read()
}

要在 PHP 中获取,只需执行$_FILE['file1'], $_FILE['file2']... 等。

于 2011-10-31T19:54:59.377 回答
1

我也遇到了这个问题,当前标记的答案对我不起作用。经过一些调试,我找到了更好的解决方案。

首先设置参数(注意:如果您不需要额外的键/值,请离开 {})。

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 年,但嘿,我也来了 ^^。

于 2016-11-04T15:37:46.257 回答