Использование класса FileReference

Flash Player 9 и более поздних версий, Adobe AIR 1.0 и более поздних версий

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

Класс FileReference имеет два разных подхода к загрузке, передаче и сохранению файлов данных. С момента введения класс FileReference включает методы browse(), upload() и download(). Используйте метод browse(), чтобы предоставить пользователю возможность выбрать файл. Используйте метод upload() для переноса данных файла на удаленный сервер. Используйте метод download() для получения данных сервера и их сохранения в локальном файле. Начиная с Flash Player 10 и Adobe AIR 1.5 класс FileReference также включает методы load() и save(). Методы load() и save() обеспечивают возможность непосредственного вызова и сохранения локальных файлов. Использование этих методов идентично методам в классах URLLoader и Loader с соответствующими именами.

Примечание. Класс File, который расширяет класс FileReference, и класс FileStream обеспечивают дополнительные функции работы с файлами и локальной файловой системой. Классы File и FileStream поддерживаются только AIR, но не поддерживаются Flash Player.

Рекомендации Adobe

Load and Save Local Files (загрузка и сохранение локальных файлов)

Кевин Хойт (Kevin Hoyt)
В этом видео Кевин Хойт показывает, насколько легко можно загружать и сохранять локальное содержимое с помощью Flash.

Класс FileReference

Каждый объект FileReference представляет один файл данных на локальном компьютере. Свойства класса FileReference содержат сведения о размере файла, его типе, имени, расширении, авторе, дате создания и дате изменения.

Примечание. Свойство creator поддерживается только в Mac OS. На всех остальных платформах оно имеет значение null.
Примечание. Свойство extension поддерживается только в Adobe AIR.

Экземпляр класса FileReference можно создать двумя способами.

  • Используйте оператор new, как показано в следующем коде:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Вызовите метод FileReferenceList.browse(), открывающий диалоговое окно, с помощью которого пользователь может выбрать один или несколько файлов для отправки. Затем метод создает массив объектов FileReference, если пользователь успешно выбирает один или несколько файлов.

Создав объект FileReference, можно выполнить следующие операции.

  • Вызовите метод FileReference.browse(), который открывает диалоговое окно и подсказывает пользователю выбрать один файл из локальной файловой системы. Обычно это делается перед последующим вызовом метода FileReference.upload() или FileReference.load(). Вызовите метод FileReference.upload() для отправки файла на удаленный сервер. Вызовите метод FileReference.load() для открытия локального файла.

  • Вызовите метод FileReference.download(). Метод download() открывает диалоговое окно, в котором пользователь может выбрать местоположение для сохранения нового файла. После этого выполняется загрузка данных с сервера и их сохранение в новом файле.

  • Вызовите метод FileReference.load(). Данный метод начинает загрузку данных из файла, который до этого был задан методом browse(). Метод load() не может быть вызван до завершения работы метода browse() (до выбора файла пользователем).

  • Вызовите метод FileReference.save(). Этот метод открывает диалоговое окно и приглашает пользователя выбрать одно местоположение для файла в локальной файловой системе. Затем он производит запись данных в выбранное местоположение.

Примечание. Одновременно может выполняться только один вызов browse(), download() или save(), так как нельзя открыть сразу несколько диалоговых окон.

Свойства объекта FileReference, такие как name, size или modificationDate определяются только после того, как произойдет одно из следующих событий.

  • Вызван метод FileReference.browse() или FileReferenceList.browse(), и пользователь выбрал файл в диалоговом окне.

  • Вызван метод FileReference.download(), и пользователь выбрал местоположение для нового файла в диалоговом окне.

Примечание. До завершения загрузки заполняется только свойство FileReference.name. Все остальные свойства становятся доступны после того, как файл загружен полностью.

Во время выполнения методов FileReference.browse(), FileReferenceList.browse(), FileReference.download(), FileReference.load() или FileReference.save() большинство проигрывателей продолжают воспроизводить содержимое SWF-файла, а также отправлять события и выполнять код.

Для выполнения операций отправки и загрузки SWF-файл может вызывать файлы только из собственного домена, а также из доменов, указанных в файле политики. Необходимо поместить файл политики на соответствующий сервер, если данный сервер находится за пределами домена SWF-файла, инициирующего отправку или загрузку.

См. описание класса FileReference.

Загрузка данных из файлов

Метод FileReference.load() позволяет загружать в память данные из локального файла.

Примечание. Сначала код должен вызвать метод FileReference.browse(), чтобы пользователь мог выбрать файл для загрузки. Это ограничение не относится к содержимому, работающему в Adobe AIR в изолированной программной среде системы защиты приложения.

Метод FileReference.load() возвращает данные сразу после вызова, однако загружаемые данные становятся доступными немного позже. Объект FileReference отправляет события для вызова методов прослушивателей на каждом этапе выполнения загрузки.

Во время загрузки объект FileReference отправляет следующие события.

  • Событие open (Event.OPEN): отправляется в момент начала операции загрузки.

  • Событие progress (ProgressEvent.PROGRESS): периодически отправляется по мере считывания байтов данных из файла.

  • Событие complete (Event.COMPLETE): отправляется после успешного завершения операции загрузки файла.

  • Событие ioError (IOErrorEvent.IO_ERROR): отправляется, если загрузку не удается выполнить из-за ошибки ввода/вывода при открытии файла или чтении данных.

После отправки события об успешном завершении операции объектом FileReference, загруженные данные становятся доступными в качестве ByteArray в свойстве data объекта FileReference.

В следующем примере показано, как попросить пользователя выбрать файл и после этого загрузить данные указанного файла в память.

package 
{ 
     import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample1 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample1() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            trace(fileRef.data); 
        } 
 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

В примере кода сначала создается объект FileReference с именем fileRef, который затем вызывает метод browse(). Метод browse() открывает диалоговое окно, в котором пользователь может выбрать файл. После выбора файла код вызывает метод onFileSelected(). Этот метод добавляет прослушиватели для событий progress и complete, а затем вызывает метод load() объекта FileReference. Другие методы обработчиков в примере просто выводят сообщения для отслеживания прогресса операции загрузки. По завершении загрузки приложение отображает содержимое загруженного файла с использованием метода trace().

В Adobe AIR класс FileStream обеспечивает дополнительные функции для чтения данных из локального файла. См. раздел «Чтение и запись файлов».

Сохранение данных в локальных файлах

Метод FileReference.save() позволяет сохранять данные в локальном файле. Сначала он открывает диалоговое окно, чтобы пользователь ввел имя для нового файла и местоположение, в котором его нужно сохранить. После выбора имени и местоположения файла эти данные записываются в новый файл. При успешном сохранении файла свойства объекта FileReference заполняются свойствами локального файла.

Примечание. Код может вызывать метод FileReference.save() только в ответ на событие пользователя, такое как щелчок мыши или нажатие клавиши. В противном случае выводится сообщение об ошибке. Это ограничение не относится к содержимому, работающему в Adobe AIR в изолированной программной среде системы защиты приложения.

Метод FileReference.save() возвращает данные сразу после вызова. Затем объект FileReference отправляет события для вызова методов прослушивателей на каждом этапе выполнения сохранения.

Во время сохранения объект FileReference отправляет следующие события.

  • Событие select (Event.SELECT): отправляется, когда пользователь указывает местоположение и имя для сохранения нового файла.

  • Событие cancel (Event.CANCEL): отправляется, когда пользователь нажимает кнопку «Отмена» в диалоговом окне.

  • Событие open (Event.OPEN): отправляется в момент начала операции загрузки.

  • Событие progress (ProgressEvent.PROGRESS): периодически отправляется по мере считывания байтов данных из файла.

  • Событие complete (Event.COMPLETE): отправляется после успешного завершения операции загрузки файла.

  • Событие ioError (IOErrorEvent.IO_ERROR): отправляется, если загрузку не удается выполнить из-за ошибки ввода/вывода при открытии файла или чтении данных.

Тип объекта, передаваемый в параметре data метода FileReference.save(), определяет способ записи данных в файл:

  • Если это значение String, оно сохраняется как текстовый файл в кодировке UTF-8.

  • Если это объект XML, он записывается в XML-файл с полным сохранением форматирования.

  • Если это объект ByteArray, его содержимое записывается непосредственно в файл без каких-либо преобразований.

  • Если объект относится к другому типу, то метод FileReference.save() вызывает для него метод toString() и сохраняет полученное значение String в текстовый файл с кодировкой UTF-8. Если не удается вызвать метод toString() объекта, выдается ошибка.

Если параметр data имеет значение null, выдается ошибка.

Следующий код расширяет предыдущий пример кода с использованием метода FileReference.load(). После чтения данных из файла этот код просит пользователя ввести имя файла и сохраняет данные в новый файл.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample2 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample2() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            fileRef.removeEventListener(Event.SELECT, onFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onComplete); 
            fileRef.removeEventListener(Event.CANCEL, onCancel); 
            saveFile(); 
        } 
        public function saveFile():void 
        { 
            fileRef.addEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.save(fileRef.data,"NewFileName.txt"); 
        } 
 
        public function onSaveFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.addEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.addEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveProgress(evt:ProgressEvent):void 
        { 
            trace("Saved " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
         
        public function onSaveComplete(evt:Event):void 
        { 
            trace("File saved."); 
            fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.removeEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveCancel(evt:Event):void 
        { 
            trace("The save request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

После завершения загрузки всех данных файла, код вызывает метод onComplete(). Метод onComplete() удаляет прослушиватели событий загрузки и вызывает метод saveFile(). Метод saveFile() вызывает метод FileReference.save(). Метод FileReference.save() открывает новое диалоговое окно, где пользователь может ввести имя и местоположение для сохранения нового файла. Оставшиеся методы прослушивателей событий отслеживают прогресс сохранения файла вплоть до его завершения.

В Adobe AIR класс FileStream обеспечивает дополнительные функции для записи данных в локальный файл. См. раздел «Чтение и запись файлов».

Отправка файлов на сервер

Чтобы отправить файлы на сервер, сначала вызовите метод browse(), чтобы пользователь мог выбрать один или несколько файлов. Затем при вызове метода FileReference.upload() выбранный файл передается на сервер. Если пользователь выбрал несколько файлов с помощью метода FileReferenceList.browse(), проигрыватель Flash Player создает массив с именем FileReferenceList.fileList, содержащий выбранные файлы. После этого можно использовать метод FileReference.upload(), чтобы загрузить каждый файл по отдельности.

Примечание. Метод FileReference.browse() позволяет загружать только отдельные файлы. Чтобы предоставить пользователю возможность загружать несколько файлов, используйте метод FileReferenceList.browse().

По умолчанию системное диалоговое окно выбора файлов позволяет выбирать любой тип файлов с локального компьютера. Разработчики могут указать один или несколько пользовательских фильтров типов файлов с помощью класса FileFilter и передать массив экземпляров фильтра файлов методу browse().

var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var allTypes:Array = new Array(imageTypes, textTypes); 
var fileRef:FileReference = new FileReference(); 
fileRef.browse(allTypes);

Когда пользователь выбрал файлы и нажал кнопку «Открыть» в системном окне выбора файлов, отправляется событие Event.SELECT. Если для выбора отправляемого файла использовался метод FileReference.browse(), следующий код отправляет файл на веб-сервер.

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    var success:Boolean = fileRef.browse(); 
} 
catch (error:Error) 
{ 
    trace("Unable to browse for files."); 
} 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm") 
    try 
    { 
        fileRef.upload(request); 
    } 
    catch (error:Error) 
    { 
        trace("Unable to upload file."); 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}
Чтобы отправить данные на сервер с помощью метода FileReference.upload(), нужно использовать свойства URLRequest.method и URLRequest.data для отправки переменных с помощью метода POST или GET.

При попытке отправить файл с помощью метода FileReference.upload() отправляется любое из следующих событий.

  • open event (Event.OPEN): отправляется в момент начала операции отправки.

  • Событие progress (ProgressEvent.PROGRESS): периодически отправляется по мере отправки байтов данных из файла.

  • Событие complete (Event.COMPLETE): отправляется после успешного завершения операции загрузки файла.

  • Событие httpStatus (HTTPStatusEvent.HTTP_STATUS): отправляется при сбое отправки в результате ошибки протокола HTTP.

  • Событие httpResponseStatus (HTTPStatusEvent.HTTP_RESPONSE_STATUS): отправляется, если вызов метода upload() или uploadUnencoded() пытается обратиться к данным через HTTP и Adobe AIR может обнаружить и вернуть код состояния для запроса.

  • Событие securityError (SecurityErrorEvent.SECURITY_ERROR): отправляется при сбое отправки вследствие нарушения системы безопасности.

  • uploadCompleteData event (DataEvent.UPLOAD_COMPLETE_DATA): отправляется после получения с сервера данных о успешном завершении отправки.

  • Событие ioError (IOErrorEvent.IO_ERROR): отправляется при сбое отправки по любой из следующих причин:

    • Возникает ошибка ввода-вывода, когда проигрыватель Flash Player считывает, записывает или передает файл.

    • SWF-файл пытается загрузить файл на сервер, требующий проверки подлинности (имя пользователя и пароль). В процессе отправки Flash Player не дает пользователям возможности ввести пароли.

    • Параметр url содержит недействительный протокол. Метод FileReference.upload() должен использовать HTTP или HTTPS.

Проигрыватель Flash Player не обеспечивает полную поддержку серверов, требующих проверки подлинности. Только SWF-файлы, выполняемые в обозревателе с использованием подключаемого модуля или элемента управления Microsoft ActiveX®, могут выводить диалоговое окно, чтобы пользователь ввел имя пользователя и пароль для проверки подлинности, и только после этого показывать диалоговое окно загрузки. При загрузке с помощью подключаемого модуля или элемента управления ActiveX, а также при загрузке или отправке данных посредством автономного или внешнего проигрывателя происходит сбой передачи файлов.

Для создания сценария сервера с помощью ColdFusion, чтобы принять отправку файла из проигрывателя Flash Player, можно использовать код, подобный следующему:

<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />

Этот код ColdFusion отправляет файл, переданный проигрывателем Flash Player, и сохраняет его в том же каталоге, что и шаблон ColdFusion, перезаписывая файлы с одинаковыми именами. Предыдущий код показывает только минимальный фрагмент кода, необходимый для принятия отправки файла. Этот сценарий не следует использовать в рабочей среде. В идеале следует добавить проверку данных, чтобы пользователи могли отправлять только допустимые типы файлов, такие как изображения, а потенциально опасные сценарии, выполняемые на стороне сервера — нет.

Следующий код демонстрирует отправки файлов с помощью РНР, включая проверку данных. Сценарий ограничивает число отправляемых файлов в каталоге до 10, следит, чтобы размер файлов не превышал 200 КБ, и разрешает отправлять и сохранять в файловой системе только JPEG-, GIF- или PNG-файлы.

<?php 
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB 
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server 
echo exif_imagetype($_FILES['Filedata']); 
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) 
{ 
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']); 
    $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); 
    if ($type == 1 || $type == 2 || $type == 3) 
    { 
        rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']); 
    } 
    else 
    { 
        unlink("./temporary/".$_FILES['Filedata']['name']); 
    } 
} 
$directory = opendir('./images/'); 
$files = array(); 
while ($file = readdir($directory)) 
{ 
    array_push($files, array('./images/'.$file, filectime('./images/'.$file))); 
} 
usort($files, sorter); 
if (count($files) > $MAXIMUM_FILE_COUNT) 
{ 
    $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); 
    for ($i = 0; $i < count($files_to_delete); $i++) 
    { 
        unlink($files_to_delete[$i][0]); 
    } 
} 
print_r($files); 
closedir($directory); 
 
function sorter($a, $b) 
{ 
    if ($a[1] == $b[1]) 
    { 
        return 0; 
    } 
    else 
    { 
        return ($a[1] < $b[1]) ? -1 : 1; 
    } 
} 
?>

В сценарий отправки можно передать дополнительные переменные с помощью метода запроса POST или GET. Чтобы отправить дополнительные переменные POST сценарию отправки, можно использовать следующий код:

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
fileRef.browse(); 
function selectHandler(event:Event):void 
{ 
    var params:URLVariables = new URLVariables(); 
    params.date = new Date(); 
    params.ssid = "94103-1394-2345"; 
    var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm"); 
    request.method = URLRequestMethod.POST; 
    request.data = params; 
    fileRef.upload(request, "Custom1"); 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

В предыдущем примере создается объект URLVariables, который передается сценарию, выполняемому на удаленном сервере. В предыдущих версиях ActionScript переменные можно передавать сценарию отправки, выполняемому на стороне сервера, путем передачи значений в строке запроса. ActionScript 3.0 позволяет передавать переменные удаленному сценарию с помощью объекта URLRequest, который позволяет передавать данные с помощью метода POST или GET. Это, в свою очередь, упрощает и ускоряет передачу более объемных пакетов данных. Чтобы указать метод запроса, с помощью которого передаются переменные (GET или POST), можно задать свойству URLRequest.method значение URLRequestMethod.GET или URLRequestMethod.POST.

Кроме того, ActionScript 3.0 позволяет переопределять стандартное имя поля отправки данных Filedata благодаря использованию второго параметра в методе upload(), как показано в предыдущем примере, где значение Filedata заменено на Custom1.

По умолчанию проигрыватель Flash Player не пытается отправлять тестовый пакет данных. Чтобы переопределить это поведение, передайте значение true в качестве третьего параметра метода upload(). Тестовая отправка выполняется для того, чтобы проверить, будет ли успешной передача фактических файлов и проверка подлинности сервера (если она требуется).

Примечание. В настоящее время тестовая отправка поддерживается проигрывателем Flash Player только в ОС Windows.

Сценарий сервера, обрабатывающий отправку файла, должен ожидать HTTP-запрос POST со следующими элементами:

  • Content-Type (тип содержимого) со значением multipart/form-data.

  • Content-Disposition (расположение содержимого), у которого атрибут name имеет значение Filedata, а атрибут filename указывает имя исходного файла. Можно указать пользовательский атрибут name, передав значение для параметра uploadDataFieldName в методе FileReference.upload().

  • Двоичное содержимое файла.

Ниже приводится пример HTTP-запроса POST:

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6  
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
Test File  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
(actual file data,,,)

Следующий пример HTTP-запроса POST отправляет три переменные POST: api_sig, api_key и auth_token, а также использует пользовательское имя поля для отправки данных "photo".

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_sig" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_key" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="auth_token" 
 
XXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="photo"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
(actual file data,,,) 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

Загрузка файлов с сервера

Чтобы предоставить пользователям возможность загружать файлы с сервера, можно использовать метод FileReference.download() с двумя параметрами: request и defaultFileName. Первый параметр представляет собой объект URLRequest, содержащий URL-адрес файла для загрузки. Второй параметр не является обязательным. Он позволяет указать имя файла по умолчанию, которое отображается в диалоговом окне загрузки файла. Если опустить второй параметр, defaultFileName, будет использоваться имя файла из указанного URL-адреса.

Следующий код загружает файл с именем index.xml из того же каталога, в котором находится SWF-файл.

var request:URLRequest = new URLRequest("index.xml"); 
var fileRef:FileReference = new FileReference(); 
fileRef.download(request);

Чтобы задать имя по умолчанию currentnews.xml вместо index.xml, укажите параметр defaultFileName, как показано в следующем фрагменте кода.

var request:URLRequest = new URLRequest("index.xml"); 
var fileToDownload:FileReference = new FileReference(); 
fileToDownload.download(request, "currentnews.xml");

Переименование файла полезно, если имя файла на сервере непонятное или сгенерировано сервером. Параметр defaultFileName также полезно указывать, когда файл загружается не напрямую, а с использованием сценария, выполняемого на стороне сервера. Например, необходимо задать параметр defaultFileName, если на сервере имеется сценарий, загружающий определенные файлы исходя из переданных ему переменных URL. В противном случае именем по умолчанию для загруженного файла будет имя сценария, выполняемого на стороне сервера.

Данные можно отправлять на сервер с помощью метода download() путем добавления параметров к URL, которые должны анализироваться сценарием сервера. Следующий код ActionScript 3.0 загружает документ на базе параметров, передаваемых сценарию ColdFusion.

package 
{ 
    import flash.display.Sprite; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 
 
    public class DownloadFileExample extends Sprite 
    { 
        private var fileToDownload:FileReference; 
        public function DownloadFileExample() 
        { 
            var request:URLRequest = new URLRequest(); 
            request.url = "http://www.[yourdomain].com/downloadfile.cfm"; 
            request.method = URLRequestMethod.GET; 
            request.data = new URLVariables("id=2"); 
            fileToDownload = new FileReference(); 
            try 
            { 
                fileToDownload.download(request, "file2.txt"); 
            } 
            catch (error:Error) 
            { 
                trace("Unable to download file."); 
            } 
        } 
    } 
}

Следующий код демонстрирует сценарий ColdFusion (download.cfm), который загружает один из двух файлов с сервера в зависимости от значения переменной URL.

<cfparam name="URL.id" default="1" /> 
<cfswitch expression="#URL.id#"> 
    <cfcase value="2"> 
        <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> 
    </cfcase> 
    <cfdefaultcase> 
        <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> 
    </cfdefaultcase> 
</cfswitch>

класс FileReferenceList

Класс FileReferenceList дает пользователю возможность выбрать один или несколько файлов для отправки сценарию, выполняемому на стороне сервера. Отправка файла обрабатывается методом FileReference.upload(), который необходимо вызывать для каждого файла, выбранного пользователем.

Следующий код создает два объекта FileFilter (imageFilter и textFilter) и передает их в массиве методу FileReferenceList.browse(). В результате этого в системном диалоговом окне открытия файла отображаются два возможных фильтра для типов файлов.

var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var fileRefList:FileReferenceList = new FileReferenceList(); 
try 
{ 
    var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); 
} 
catch (error:Error)  
{ 
    trace("Unable to browse for files."); 
}

Использование класса FileReferenceList обеспечивает возможность выбирать и отправлять один или несколько файлов аналогично тому, как метод FileReference.browse() дает возможность выбирать файлы, только FileReferenceList позволяет выбирать сразу несколько файлов. Для отправки нескольких файлов требуется вызывать для каждого из них метод FileReference.upload(), как показано в следующем коде.

var fileRefList:FileReferenceList = new FileReferenceList(); 
fileRefList.addEventListener(Event.SELECT, selectHandler); 
fileRefList.browse(); 
 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm"); 
    var file:FileReference; 
    var files:FileReferenceList = FileReferenceList(event.target); 
    var selectedFileArray:Array = files.fileList; 
    for (var i:uint = 0; i < selectedFileArray.length; i++) 
    { 
        file = FileReference(selectedFileArray[i]); 
        file.addEventListener(Event.COMPLETE, completeHandler); 
        try 
        { 
            file.upload(request); 
        } 
        catch (error:Error) 
        { 
            trace("Unable to upload files."); 
        } 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

Так как событие Event.COMPLETE добавляется к каждому объекту FileReference в массиве, проигрыватель Flash Player вызывает метод completeHandler() после отправки отдельного файла.