2016-07-04 3 views
1

Мне нужно вызвать удаленный обработчик интерфейса REST и отправить его в тело запроса. Обратите внимание: Я не управляю сервером. Я не могу изменить запрос на мультипликацию, клиент должен работать в соответствии с внешней спецификацией.Загрузка файла через Jaxax REST Клиентский интерфейс с сторонним сервером

До сих пор мне удалось заставить его работать, как это (исключая заголовки и т.д., для краткости):

byte[] data = readFileCompletely(); 
client.target (url).request().post (Entity.entity (data, "file/mimetype")); 

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

Вопрос: Возможно ли использовать потоки или что-то подобное, чтобы избежать чтения всего файла в память?

Если возможно, я предпочел бы избежать расширения, специфичного для реализации. Если нет, то решение, которое работает с RESTEasy (на Wildfly), также приемлемо.

+0

Каков фактический тип носителя? 'application/octet-stream' имеет запись, которая может обрабатывать' InputStream'. Или я думаю, что ['StreamingOutput'] (http://stackoverflow.com/a/12012867/2587435) даже работает на стороне клиента для всех типов носителей, хотя я его не пробовал, но я полагаю, что это _should_ work –

+0

It полностью зависит от содержимого файла, но обычно это будет «application/pdf». – doublep

+0

Я бы попробовал 'StreamingOutput'. Я думаю, что использовал его раньше на стороне клиента. Я не помню. –

ответ

1

ReastEasy, а также Джерси поддержки InputStream из коробки поэтому просто используйте Entity.entity(inputStream, "application/octet-stream"); или любой заголовок Content-Type, который вы хотите установить.

1

Вы можете перейти на низкоуровневый и сконструировать HTTP-запрос, используя библиотеку, такую ​​как простой java.net.URLConnection.

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

Upload files from Java client to a HTTP server

Конечно, это решение требует больше ручного кодирования, но он должен работать (если java.net.URLConnection не загружает весь файл в память)

+0

Да, возможно, я должен использовать sth. как в конце концов. – doublep

+0

Интересно, теперь я сделал больше тестов. Хотя обработка 'FileInputStream' (или даже самого' File') для 'Entity.entity()' работает, то, что действительно передается по HTTP, является строкой «data: application/octet-stream; base64, ...». То есть а не сырое содержимое файла, на которое я надеялся. Сервер, с которым я сотрудничаю, кажется, прекрасно справляется с этим, но мне кажется странным. Почему бы просто не поместить содержимое файла в исходное состояние? Кодирование сначала сдувает размер на треть * и * требует некоторой дополнительной обработки с сервера. И я не вижу никаких преимуществ. – doublep

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