Альтернатива блокировке типа файла в FileReference.save () AS3 - PullRequest
8 голосов
/ 30 июня 2011

Обновление:

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

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

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

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.browse () перед save (), как показано в этого урока , но это выдает ошибку, поскольку вы можете выполнить только один вызов FileReference за раз.

file save dialog

Ответы [ 8 ]

4 голосов
/ 30 июня 2011

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

Проголосуйте за это здесь: 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


Редактировать: Добавление навигации к информации об обходном пути

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

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

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

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

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

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

1 голос
/ 10 июля 2012

Эдуард предоставил обходной путь в трекере запросов функций Adobe для этой проблемы: удвоение расширения файла, например «image.jpg.jpg».Это то, что мы сделаем, поскольку для наших пользователей, которые скрывают расширения, расширения удаляются независимо от того, изменяют ли они имя файла.

1 голос
/ 11 августа 2011

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

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

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

0 голосов
/ 29 декабря 2015
file.save(byteData, "myImage.jpg"+Math.floor((Math.random())*100)+".jpg");

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

0 голосов
/ 26 августа 2013

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

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

0 голосов
/ 27 сентября 2011

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

files = new FileReference();
files.browse(new Array(new FileFilter("Image (*.png)", "*.png")));
files.cancel(); // Important
files.save(/* Your Data Here */);
  • Нейтральная
0 голосов
/ 30 июня 2011

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

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

...