Как предоставить API для потоковой передачи файлов через Restlet? - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь реализовать возобновляемую загрузку (используя протокол TUS https://tus.io/) в нашем Restlet API. Я получил протокол для работы по большей части, но затем я столкнулся с проблемой способа, которым Restlet, кажется, обрабатывает загрузку файлов - он, кажется, ждет завершения загрузки всего файла, прежде чем передать ресурс, который должен обработать звонок.

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

Код контроллера (ресурса Restlet), который обрабатывает вызовы PATCH, действительно прост:

@Patch
public void tusPatch(final Representation data) {
   tusService.process(getRequest(), getResponse(), userId);
   // Add some TUS specific headers and we're done.
}

Таким образом, проблема в том, что всякий раз, когда я загружаю файл, Restlet (или, может быть, базовый сервер Jetty?) Сначала будет ждать, пока клиент завершит ВСЮ загрузку, прежде чем передать результирующее представление в класс контроллера и мой метод PATCH.

По сути, мне нужен некий InputStream загруженного файла, из которого я могу читать, пока файл загружается.

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

...