AS3 Загрузка файла IOError # 2038 - PullRequest
2 голосов
/ 30 июля 2010

Эй, у меня проблемы с загрузкой файла с помощью FileReference.

Загрузка работает нормально при запуске SWF в автономном режиме. Работает отправка файла на удаленный сервер и на локальный хост (работает одно и то же приложение). Но когда SWF встраивается в Firefox, Chrome или Safari, я получаю IOError # 2038. Странно то, что он работает нормально с IE8 ... Я также попытался загрузить файл из HTML-формы, и он работает (на каждом браузере). Файл crossdomain.xml установлен с полным доступом, но никогда не вызывается (в любом случае это не должно быть ...)

Любая помощь очень ценится!

Ответы [ 3 ]

3 голосов
/ 30 июля 2010

Мне наконец-то удалось решить эту проблему.

Проблема возникла из-за того, что пользователю пришлось выполнить вход перед выполнением операции загрузки.При выполнении операции загрузки с объектом FileReference flashplayer не отправляет cookie-файл сеанса, сохраненный браузером, он имеет что-то вроде собственного пространства cookie.Вы можете узнать о «Flash Cookie Bug» в Google для получения дополнительной информации.

Ошибка уже сообщена в Adobe:

Невозможно опубликовать ссылки из-за моего представителя (добавьте https://). ..

Решение, которое я реализовал (почти так же, как библиотека SWFUpload решает эту проблему), состоит в том, чтобы вручную отправлять мой sessionid при выполнении загрузки.

Я нашел эту ссылку очень полезной, так как я использую бэкэнд Django. http://blog.fogtunes.com/2009/11/howto-integrate-swfupload-with-django/

Идея состоит в том, что бэкэнд отправляет во флэш-приложение sessionid после выполнения входа в систему. Затем, когда флэш-приложение вызывает метод upload (), вы должны отправить этот sessionid (добавив его всвойство данных URLRequest внутри объекта URLVariables. Наконец, когда сервер получает запрос, он должен использовать sessionid для правильной установки активного сеанса перед обработкой операции загрузки.

var urlReq:URLRequest = new URLRequest("http://url-for-upload/");
urlReq.method = URLRequestMethod.POST;
urlReq.data = new URLVariables();
urlReq.data.sessionid = sessionid_from_server; // this is a variable holding the sessionid received by the server after performing the login
fileReference.upload(urlReq);
1 голос
/ 30 июля 2010

FileReference, скажем, довольно странно, как он работает с относительными путями.В большинстве случаев базовый путь - это путь, с которого был загружен SWF.За исключением IE (или это было наоборот? Я не могу вспомнить прямо сейчас).Я думаю, что это не проблема IE / Firefox / chrmoe, а проблема игрока.Для IE есть флэш-плеер, который использует ActiveX, и плеер для остальных браузеров.В какой-то момент они расходятся в том, как они обрабатывают относительные пути для объектов FileReference.Если это особенность, это довольно глупо, так что я чувствую, что это ошибка, но я не проверил базу ошибок, поэтому я не уверен, официально ли это считается ошибкой или нет.Кроме того, установка base_path в коде встраивания не работает.

В любом случае, единственный разумный способ избежать этого безумия - использовать полный путь.Попытка определить, будет ли это IE или нет, вероятно, будет работать, но я думаю, что в какой-то момент это раздражение будет исправлено;и когда это произойдет, ваш код сломается, так что я думаю, что это плохая идея.

Теперь вы, вероятно, не захотите жестко задавать полный путь в своем SWF, так что простое решение, которое я использовал дляЧтобы обойти эту проблему (при условии, что вы можете изменить код для встраивания), этот путь передается через flash var, когда вы встраиваете свой SWF.Как правило, я получаю этот путь с помощью php, поэтому мне не нужно вручную изменять его при развертывании или перемещении материала (я передаю абсолютный путь в «корень приложения», который для меня обычно представляет собой HTML-код, который встраиваетSWF; затем я объединяю это с относительным путем, где живет файл, который обрабатывает сообщение, так что для вашего SWF это все равно, что использовать относительный путь в пути).

Итак, если вы можете использовать какую-то часть сервера, вы можете просто написать этот маленький кусочек кода один раз и забыть об этом.Но даже если вы сделаете это вручную, это будет легче поддерживать, чем перекомпилировать ваш swf.

0 голосов
/ 30 августа 2011

Я столкнулся с этой проблемой.Проблема в том, что ваш клиент не может получить доступ к вашему приложению ... и, вероятно, путь к приложению относительно клиента.Если вы полностью квалифицируете его на стороне клиента, он будет работать с FF и Chrome и Safari.

По какой-то причине IE может разрешить его, в отличие от других браузеров.Тем не менее, это лучшая практика, чтобы полностью определить путь.Кто-нибудь может объяснить, как IE может решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...