Может ли веб-сервис вернуть поток? - PullRequest
28 голосов
/ 25 сентября 2008

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

На данный момент определения методов выгрузки и загрузки выглядят так (написано с использованием Apache CXF):

boolean uploadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename,
    @WebParam(name = "fileContents") byte[] fileContents)
    throws UploadException, LoginException;

byte[] downloadFile(@WebParam(name = "username") String username,
    @WebParam(name = "password") String password,
    @WebParam(name = "filename") String filename) throws DownloadException,
    LoginException;

Таким образом, файл загружается и загружается как байтовый массив. Но если у меня есть файл какого-то глупого размера (например, 1 ГБ), он наверняка попытается поместить всю эту информацию в память и завершит работу моего сервиса.

Итак, мой вопрос - можно ли вместо этого вернуть какой-нибудь поток? Я бы предположил, что это не будет ужасно независимым от ОС, хотя. Хотя я знаю теорию веб-сервисов, практическая сторона - это то, что мне все еще нужно, чтобы собрать немного информации.

Приветствия для любого входа, Lee

Ответы [ 12 ]

0 голосов
/ 25 сентября 2008

Имейте в виду, что запрос веб-службы в основном сводится к одному HTTP POST.

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

Чанкинг, как упомянул @Guvante, будет самым близким к тому, что вы хотите.

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

0 голосов
/ 25 сентября 2008

Один из способов сделать это - добавить uploadFileChunk (byte [] chunkData, int size, int offset, int totalSize) (или что-то в этом роде), который загружает части файла и серверы. записывает это на диск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...