2013-12-02 2 views
6

Я пытаюсь загрузить SWF-файл с помощью Джерси с веб-ресурса.Как сохранить файл с ответа Джерси?

Я написал следующий код, но не может сохранить файл правильно:

Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM) 
    .cookie(cookie) 
    .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE)); 

String binarySWF = response.readEntity(String.class);          
byte[] SWFByteArray = binarySWF.getBytes();  

FileOutputStream fos = new FileOutputStream(new File("myfile.swf")); 
fos.write(SWFByteArray); 
fos.flush(); 
fos.close(); 

Это сохранить предположить, что ответ действительно возвращает SWF-файл, а response.getMediaType возвращает application/x-shockwave-flash.

Однако, когда я пытаюсь открыть SWF, ничего не происходит (также нет ошибки), которые предполагают, что мой файл не был создан из ответа.

ответ

6

Я, наконец, получил его на работу.

Я понял, что прочитал API Джерси, чтобы я мог напрямую использовать getEntity для извлечения InputStream response (при условии, что он еще не был прочитан).

Использование getEntity для извлечения InputStream и IOUtils#toByteArray, которые создают массив байтов из InputStream, мне удалось заставить его работать:

Response response = webResource.request(MediaType.APPLICATION_OCTET_STREAM) 
    .cookie(cookie) 
    .post(Entity.entity(form, MediaType.APPLICATION_FORM_URLENCODED_TYPE));             

InputStream input = (InputStream)response.getEntity(); 

byte[] SWFByteArray = IOUtils.toByteArray(input); 

FileOutputStream fos = new FileOutputStream(new File("myfile.swf")); 
fos.write(SWFByteArray); 
fos.flush(); 
fos.close(); 

Обратите внимание, что IOUtils общая функция Apache.

+0

Читая эти годы после того, как она определенно выглядит лучше обработки флеш/закрыть может быть написано здесь (также для входного потока) с использованием попытки Java с ресурсами. –

1

Я думаю, вы не должны проходить через String.

Если ответ действительно SWF-файл (двоичные данные), то здесь:

String binarySWF = response.readEntity(String.class); 

вместо этого кода (который читает строки), просто попробуйте прочитать
байтовый массив. Посмотрите, помогает ли это. Строки связаны с кодировками
и, вероятно, что все в порядке.

5

С Java 7, вы можете также использовать новый NIO API для записи входного потока в файл:

InputStream is = response.readEntity(InputStream.class) 
Files.copy(is, new File(...).toPath()); 
+0

'response.getEntity()' не принимает параметры (по крайней мере, в jersey-client 2.26). Может быть, вы имели в виду 'response.readEntity (InputStream.class)'? – leveluptor

+1

Я не могу проверить это прямо сейчас, но, по словам Джавадока, вы правы. Я обновил ответ. Спасибо за ответ! – ocroquette

Смежные вопросы