У меня есть 3 машины:
- сервер, на котором находится файл.
- сервер, на котором работает служба REST (Джерси)
- клиент (браузер) с доступом к 2-му серверу, но не доступ к 1-му серверу
Как я могу напрямую (без сохранения файла на 2-м сервере) загружать файл с 1-го сервера на клиентскую машину?
С 2-го сервера я могу получить ByteArrayOutputStream, чтобы получить файл с 1-го сервера, могу ли я передать этот поток дальше клиенту с помощью службы REST?
Он будет работать таким образом?
Таким образом, в основном я хочу, чтобы клиент мог загружать файл с 1-го сервера с помощью службы REST на 2-м сервере (поскольку прямой доступ с клиента на 1-й сервер отсутствует), используя только потоки данных (поэтому нет данных касаясь файловой системы 2-го сервера).
Что я сейчас делаю с библиотекой EasyStream:
final FTDClient client = FTDClient.getInstance();
try {
final InputStreamFromOutputStream<String> isOs = new InputStreamFromOutputStream<String>() {
@Override
public String produce(final OutputStream dataSink) throws Exception {
return client.downloadFile2(location, Integer.valueOf(spaceId), URLDecoder.decode(filePath, "UTF-8"), dataSink);
}
};
try {
String fileName = filePath.substring(filePath.lastIndexOf("/") + 1);
StreamingOutput output = new StreamingOutput() {
@Override
public void write(OutputStream outputStream) throws IOException, WebApplicationException {
int length;
byte[] buffer = new byte[1024];
while ((length = isOs.read(buffer)) != -1){
outputStream.write(buffer, 0, length);
}
outputStream.flush();
}
};
return Response.ok(output, MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", "attachment; filename=\"" + fileName + "\"" )
.build();
UPDATE2
Итак, мой код теперь с пользовательским MessageBodyWriter выглядит просто:
ByteArrayOutputStream baos = новый ByteArrayOutputStream (2048); client.downloadFile(location, spaceId, filePath, baos); return Response.ok(baos).build();
Но я получаю ту же самую ошибку кучи при попытке с большими файлами.
Update3 Наконец удалось заставить его работать! StreamingOutput сделал трюк.
Спасибо @peeskillet! Большое спасибо!