Загрузите файл PDF в Flex с помощью HTTPService

Привет, кто-то знает, как скачать PDF-файл с помощью HTTPService?
Я делаю это

private function downloadPDF():void
{
    var httpService:HTTPService = new HTTPService();
    httpService.url = "http://coenraets.org/flexandroid90/FlexAndroid90Minutes.pdf";
    httpService.addEventListener(ResultEvent.RESULT, result);
    httpService.addEventListener(FaultEvent.FAULT, fault);
    httpService.send();
}

private function fault(event:FaultEvent):void
{
    trace("Error");
    trace("\t> Code : "+event.fault.faultCode);
    trace("\t> Description : "+event.fault.faultString);
    trace("\t> Detail : "+event.fault.faultDetail);
}

private function result(event:ResultEvent):void
{
    var pdfFile:File = new File(File.applicationStorageDirectory.nativePath + File.separator + "myPDF.pdf");
    var fileStream:FileStream = new FileStream();
    fileStream.open(pdfFile, FileMode.WRITE);
    fileStream.writeUTFBytes(event.result as String);
    fileStream.close();
}

Но у меня ошибка

Ошибка
Код: Client.CouldNotDecode
Описание: Ошибка № 1090: Ошибка синтаксического анализатора XML: элемент имеет неправильный формат.
Подробности: null

С URLLoader работает нормально

private function initPDF():void
{
    loader = new downloadPDF();
    loader.dataFormat = URLLoaderDataFormat.BINARY;
    var request:URLRequest = new URLRequest("http://coenraets.org/flexandroid90/FlexAndroid90Minutes.pdf");
    configureListeners(loader);
    try {
        loader.load(request);
    } catch (error:Error) {
        trace("Unable to load requested URL.");
    }
}

private function configureListeners(dispatcher:EventDispatcher):void {
    dispatcher.addEventListener(Event.COMPLETE, completeHandler);
    dispatcher.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
}

private function completeHandler(event:Event):void {
    var pdfFile:File = new File(File.applicationStorageDirectory.nativePath + File.separator + "myPDF.pdf");
    var fileStream:FileStream = new FileStream();
    fileStream.open(pdfFile, FileMode.WRITE);
    fileStream.writeBytes(loader.data);
    fileStream.close();
}

private function ioErrorHandler(event:IOErrorEvent):void {
    trace("ioErrorHandler: " + event);
}

person Snote    schedule 09.09.2011    source источник
comment
HTTPService используется для вызова веб-службы, которая вернет вам данные в текстовой или XML-форме. На самом деле это запрос к серверу (не к базе данных, поймите меня правильно). Почему вы хотите использовать сервис вместо обычного URLLoader?   -  person Exort    schedule 09.09.2011
comment
Меня попросили по возможности использовать HTTPService. Но я буду использовать URLLoader   -  person Snote    schedule 09.09.2011
comment
@Snote, вы также можете получать двоичные данные через HTTPService, проверьте мой ответ   -  person Pranav Hosangadi    schedule 10.09.2011


Ответы (2)


Что вы можете.

Вам просто нужно добавить
httpService.resultFormat="text"

Это просто даст вам строковый ответ, не разбирая его как xml. Хотя это не рекомендуется, поскольку HTTPService предназначен для WebServices, это МОЖНО сделать.

person Pranav Hosangadi    schedule 10.09.2011
comment
+1 Ага, у HTTPService другое предназначение. Если вы собираетесь загружать двоичные файлы, используйте вместо этого URLLoader. Использование HTTPService, вероятно, создает больше экземпляров, чем вам нужно. Тот, кто сказал вам использовать HTTPService, должен знать разницу. - person Mark Lapasa; 13.09.2011
comment
HTTPService может быть полезен, когда двоичный ресурс находится на другом хосте, который не доступен напрямую клиенту ... это дешевый и быстрый способ прокси-сервера и обслуживания этих ресурсов, не полагаясь на реальный внешний прокси. - person Cosma Colanicchia; 22.03.2012

Дело в том, что вы не можете загрузить что-то, кроме текста или XML (то есть текст), с помощью HTTPLoader.

person LoremIpsum    schedule 09.09.2011