#file-upload #appcelerator-mobile #titanium-mobile
#загрузка файлов #appcelerator-мобильный #titanium-мобильный
Вопрос:
Я разрабатываю с помощью Appcelerator SDK 1.6.2 для iOS 4.3
Я пытаюсь загрузить несколько файлов на сервер, проблема в том, что количество файлов является динамическим и, следовательно, не может быть предопределено в параметрах отправки 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()
});
однако я не уверен, как получить это динамически из-за того, что количество передаваемых изображений может варьироваться
Предложения были бы замечательными
Ответ №1:
У меня была именно эта проблема, и в итоге я использовал метод 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);
Вот документ Mozilla для defineProperty:
Ответ №2:
Вы хотите использовать xhr в параметре POST, поэтому xhr.open("POST", url);
Во-вторых, попробуйте использовать каждый файл в другом индексе объекта, например:
{
file1: imageFile.read(),
file2: imageFile2.read()
}
Чтобы захватить PHP, просто сделайте $_FILE['file1'], $_FILE['file2']
… и т.д.
Комментарии:
1. проблема заключается в том, что количество изображений (и самих изображений) полностью динамично в зависимости от пользователя. Как бы я динамически устанавливал индексы?
2. Для будущих читателей — мне также пришлось использовать метод ‘.toImage ()’, чтобы это сработало
Ответ №3:
Я также столкнулся с этой проблемой, и текущий отмеченный ответ не сработал для меня. После некоторой отладки я нашел лучшее решение.
Сначала установите параметры (примечание: оставьте {}, если вам не нужны дополнительные ключи / значения).
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 лет, но, эй, я тоже добрался сюда ^^.
Комментарии:
1. это лучший ответ 🙂 когда я писал свой, я не знал о синтаксисе для динамической настройки свойств объекта,
obj[keyString] = val
поэтому я использовал longwindedObject.defineProperty
, но он менее удобочитаем