Альтернатива блокировке типа файла на FileReference.save () AS3


Обновление:

Как описано в ответе Якоба ниже, ограничение или исправление поведения FileReference.сохранить невозможно. Может ли кто-нибудь предложить альтернативу (сервер Apache/PHP), которая соответствует всем моим критериям из этого поста и избегает ловушек, которые я обсуждал с Джейкобом?

Конец редактирования

Я сохраняю изображение из моего приложения AS3 с помощью FileReference.сохранить(). Это код, который прекрасно работает:

var encoder:JPGEncoder = new JPGEncoder(80);
var byteData = encoder.encode(myBMD);  //bitmap data object created earlier
var file:FileReference = new FileReference();
file.save(byteData, "myImage.jpg");

Откроется диалоговое окно Сохранить файл. как и ожидалось. Я использую это вместо того, чтобы отправлять byteData в PHP, потому что я хочу, чтобы у пользователя было знакомое диалоговое окно, которое позволяет ему установить свое собственное имя файла.

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

Я не знаю никакого способа заставить тип файла в диалоге сохранения (если есть такой, который был бы моим предпочтительным маршрутом), так что может ли кто-нибудь предложить безопасный способ для меня сделать это, который все еще позволяет пользователю устанавливать имя файла самостоятельно, используя стандартный диалог для своей ОС?

Я попытался вызвать FileReference.обзор () перед сохранением (), как показано в это учебник , но это приводит к ошибке, потому что вы можете выполнить только один вызов FileReference одновременно.

диалог сохранения файла

8 8

8 ответов:

Извините, это известная, крупная ошибка flash player без реального обходного пути.

Голосуйте за него здесь: https://bugs.adobe.com/jira/browse/FP-2014

(хотя по какой-то причине Adobe называет это запросом функций.)


править 2:

Исправлено для FP 11.8 для Chrome, как на Mac OS, так и на Windows.

Https://bugbase.adobe.com/index.cfm?event=bug&id=2898055


Edit: добавление обходного пути navigateTo информация

Существует опция php для выполнения navigateTo(): отправка файла на страницу php, которая имеет mime-тип image/jpeg Если вы укажете правильные заголовки, вы можете заставить браузер вызвать собственное диалоговое окно сохранения браузера, которое поддерживает расширения. Однако у этого метода есть и другие недостатки:

  • Нет обработки ошибок из flex
  • дополнительное время запроса
  • дополнительная нагрузка на сервер.
  • Нет обратной связи с пользователем, пока файл загружается и повторно загружается.
  • несогласованный пользовательский интерфейс в браузере / ОС.
    • некоторые браузеры фактически открывают новое окно, которое исчезает
    • некоторые покинут окно.
    • у некоторых вообще не будет нового окна.

После долгих обсуждений и учитывая нашу базу пользователей, наше решение:

  1. Определите, когда возникает проблема: в прослушивателе событий FileReference SELECT проверьте, изменил ли пользователь имя файла и было ли удалено расширение.
  2. Если возникла проблема, отмените операцию. Запустите операцию снова, используя метод 'Server bounce' с navigateToURL ()

Мы обнаружили, что большую часть времени пользователь не менял имя, поэтому нам редко нужно возвращаться к нему. второй способ, который менее желателен.

Обратите внимание, что для устранения проблем несоответствия браузера navigateURL (), упомянутых ранее, мы сочли полезным указать "Content-disposition:attachment" в заголовке, возвращаемом сервером.

Жаль, что это недоступно. Я могу понять, что пользователи должны иметь свободу сохранения файлов так, как они хотят. Но что, если вы забудете добавить расширение? По моему опыту Flex сохраняет файл как обычный файл без расширения. При этом некоторые пользователи могут не знать, что делать с сохраненным файлом. Так как не каждый пользователь будет знать, что означают/являются различные расширения и надеяться открыть файлы с неправильными расширениями. Я часто видел, как тихо люди просят Хоуп об этом. откройте конкретный файл со странным расширением или вообще без расширения.

Я частично понимаю, почему Adobe рассматривает его как запрос функции, а не ошибку. Но видя, как он может испортить процесс вещей, вы, возможно, скорее захотите рассмотреть его как ошибку. Как я уже сказал, Не каждый пользователь будет знать, как открыть файл с именем "myfile" вместо "myfile".формат JPG". И сколько пользователей, которые понимают, как его открыть, установили".корова " как расширение, которое будет открыто imageviewer, и как будет работать ОС реагировать на такое странное расширение? Ну, может быть ".корова " - плохой пример, но я думаю, что вы поняли суть.

Обходным путем для этого может быть создание функции самостоятельно. То есть вы даете пользователю всплывающее окно (или как вы предпочитаете его) с возможностью указать имя файла, получить расположение файла, а затем Сохранить/Отменить кнопку. Затем вы можете проверить, добавили ли они расширение, заполнили имя файла и указали местоположение файла (это даже правильно). Это в сочетании с функцией FileStream должно (если я не ошибаюсь) быть решением для создания аналогичной функции, как опция сохранить диалог.

Eduard предоставил обходной путь в Adobe feature request tracker для этой проблемы: удвоение расширения файла, например " image.формат jpg.формат JPG". Это то, что мы будем делать, так как для наших пользователей, которые скрывают расширения, расширения удаляются независимо от того, изменяют они имя файла или нет.

Ответ таков... это не только не является частью FileReference (или File, который является Adobe Air), это также не наша забота. Если пользователь хочет сохранить все файлы как .корова, пусти его! Может быть, он так настроил свою машину .корова будет открыта в формате jpeg.

Честно говоря, как пользователя, меня действительно беспокоит, когда кто-то считает, что у него есть право сказать мне, какие файлы я буду называть на своей машине.

Я знаю, что прошло много времени с тех пор, как это было опубликовано, но... Ссылаясь на Amoeba.co -учебник, вы можете сделать это (пример для PNG-изображений):

files = new FileReference();
files.browse(new Array(new FileFilter("Image (*.png)", "*.png")));
files.cancel(); // Important
files.save(/* Your Data Here */);
  • нейтральный

Для этого решения нет реальной рабочей области, так как оно связано с настройкой по умолчанию в windows. Microsoft решила, что людям не нужно знать имена расширений, и таким образом создала параметр, который скрывает типы расширений файлов известных типов файлов. Чтобы исправить это, пользователь должен очистить эту настройку, выполнив шаги, показанные здесь

Http://windows.microsoft.com/en-in/windows/show-hide-file-name-extensions#show-hide-file-name-extensions=windows-7

file.save(byteData, "myImage.jpg"+Math.floor((Math.random())*100)+".jpg");

Ваша проблема решена.