Загрузка нескольких файлов Titanium Appcelerator

#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:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty?redirectlocale=en-USamp;redirectslug=JavaScript/Reference/Global_Objects/Object/defineProperty#Adding_properties_and_default_values

Ответ №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 поэтому я использовал longwinded Object.defineProperty , но он менее удобочитаем