![]() |
При загрузке файлов перепутываются имена файлов
Здравствуйте.
Flash я начал изучать буквально меньше недели назад, поэтому прошу не пинать если что не так). Решил написать мультизагрузчик изображений на сервер с ресайзом на стороне клиента. Путём проб, ошибок, чтения мануалов и просмотра чужого кода написал код и всё вроде бы работает (фотографии ресайзятся и загружаются), но при загрузке большого количества файлов на сервер, у них(файлов) путаются названия. К примеру, выбираем файлы: 1.jpg, 2.jpg, 3.jpg, 4.jpg, 5.jpg и загружаем их. На сервере изображение 5.jpg становится 4.jpg, а 1.jpg становится 2.jpg. Возникает ощущение, что эти перепутывания случайны, никакой закономерности не получается обнаружить. Если загружать 2-3 фотографии, то "перепутываний" названий не происходит. Сейчас попытаюсь объяснить сам код. По клику по кнопке вызывается метод browse() объекта FileReferenceList. Когда пользователь выбирает файлы, вызывается функция onSelect, в которой запускается цикл с количеством итераций, равным количеству файлов. На каждой итерации создаётся объект FileReference и у него вызывается метод load(), а также в массив ArrayCollection (предназначенный для хранения имён файлов) добавляется элемент с именем файла. На каждой итерации также создаётся addEventListener, который "слушает" загрузку файла во флэш и запускает функцию onLoad(), в которой вызывается метод loadBytes объекта Loader. Далее запускается функция resize() с параметрами BitmapData, размером и именем файла. Элемент с индексом 0 массива ArrayCollection удаляется. Функция resize(), помимо самого ресайза, выполняет и загрузку файлов на сервер. Вот и сам код: Код AS3:
Возникает впечатление, что цикл переходит на следующую итерацию, не дождавшись, когда выполнятся все функции, запускаемые по elem.addEventListener(Event.COMPLETE, onLoad);, отсюда и путаница в названиях файлов. В чём может быть проблема? Буду благодарен за любые мысли. Вместо массива fileNames:ArrayCollection = new ArrayCollection раньше заводил строковую переменную fileName:String, но во всех итерациях цикла эта переменная принимала одно значение. |
По всей видимости у вас не успевает загрузиться предыдущее изображение и вы начинаете грузить следующее.
Воспользуйтесь рекурсией. Как только происходит комплит, начинайте грузить следующее изображение, если его номер не превышает общего колличества. В вашем onSelect запускайте загрузку одного изображения. Слушайте COMPLETE. Как только он произойдёт - начинайте грузить следующее изображение, где опять же начинайте слушать COMPLETE. Цитата:
И ещё по теме с JPEG. Это работает быстрее, чем использованный вами вариант. Спасибо говорить BlooDHounD |
Спасибо большое за ответ! Сейчас попробую реализовать.
upd. Всё, сделал. Также прикрутил кодировщик jpeg blooddy_crypto.swc, действительно, работает заметно быстрее стандартного. |
А смысл ждать загрузки предыдущего файла чтобы загрузить следующий, как то не по христиански. А если он вообще не загрузится (собака кабеля погрызла), как минимум обработку ошибок добавить надо. А вообще загрузку по хорошему нужно делать параллельно (в этом и смысл слова "мультизагрузчик"). К примеру, Loader вынести в отдельный класс, в котором будет храниться имя файла, тогда по завершению загрузки будет известно какому файлу соответствуют загруженные данные.
|
Stitch512, у меня стояла цель сделать загрузчик, как ВКонтакте (там же загрузчик последовательно загружает?), чтобы можно было выбрать сразу несколько файлов и последовательно их загрузить. Важна возможность для пользователя редактировать свойства первой и последующих фотографий, пока загружаются остальные. Обработку ошибок само собой добавлю, когда буду запускать проект.
Кстати, ещё вопрос: оправдано ли я поступил, сделав ресайз на стороне клиента для среднего и малого размера? Ведь в этом случае получается, что для одной фотки придётся сделать три аплода (оригинал фото, средняя и миниатюра). Плюс этого решения в том, что серверу не приходится нагружаться для ресайза. Минус - большой трафик. Можно было бы сделать загрузку сразу оригинала и последующий ресайз уже на сервере, однако это нехило нагружало бы сервер (фотографии будут загружать до 4МБ). В данном случае плюс как раз меньший трафик. Я так понимаю тот же ВКонтакте использует первый вариант (ресайзит все варианты фото на клиенте и загружает уже готовые на сервер). Я прав? |
Цитата:
А если клиент загрузит какую-нибудь вообще огромную пикчу? Так будет и трафик большой и нагрузка сервера. Конечно это все лучше делать на машине пользователя. Так по крайней мере уже будут примерно известны размеры всех трех картинок в сумме. И трафик, в большинстве случаев, как раз будет меньше. |
| Часовой пояс GMT +4, время: 20:24. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.