Titanium Appcelerator多文件上传

问题描述 投票:2回答:3

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

然而,我不确定如何动态获得这个,因为传输的图像数量可能会有所不同

建议会很棒

file-upload appcelerator-mobile titanium-mobile
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


1
投票

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

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

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

要抓住PHP,只需要做$_FILE['file1'], $_FILE['file2'] ...等。


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

© www.soinside.com 2019 - 2024. All rights reserved.