Я пытаюсь загрузить несколько файлов с одним запросом http get в моем приложении spring-mvc.Загрузить несколько файлов Java Spring
Я смотрел другие сообщения, говоря, что вы можете просто заархивировать файл и отправить этот файл, но он не идеален в моем случае, так как файл не находится в прямом доступе от приложения. Чтобы получить файлы, я должен запросить интерфейс REST, который передает файл из hbase или hadoop.
У меня могут быть файлы размером более 1 Go, поэтому загрузка файлов в репозиторий, их замена и отправка их клиенту будут слишком длинными. (Учитывая, что большой файл уже является zip, zipping не сжимает их).
Я видел here и there, которые вы можете использовать multipart-response
, чтобы загрузить сразу несколько файлов, но я не могу получить никакого результата. Вот мой код:
String boundaryTxt = "--AMZ90RFX875LKMFasdf09DDFF3";
response.setContentType("multipart/x-mixed-replace;boundary=" + boundaryTxt.substring(2));
ServletOutputStream out = response.getOutputStream();
// write the first boundary
out.write(("\r\n"+boundaryTxt+"\r\n").getBytes());
String contentType = "Content-type: application/octet-stream\n";
for (String s:files){
System.out.println(s);
String[] split = s.trim().split("/");
db = split[1];
key = split[2]+"/"+split[3]+"/"+split[4];
filename = split[4];
out.write((contentType + "\r\n").getBytes());
out.write(("\r\nContent-Disposition: attachment; filename=" +filename+"\r\n").getBytes());
InputStream is = null;
if (db.equals("hadoop")){
is = HadoopUtils.get(key);
}
else if (db.equals("hbase")){
is = HbaseUtils.get(key);
}
else{
System.out.println("Wrong db with name: " + db);
}
byte[] buffer = new byte[9000]; // max 8kB for http get
int data;
while((data = is.read(buffer)) != -1) {
out.write(buffer, 0, data);
}
is.close();
// write bndry after data
out.write(("\r\n"+boundaryTxt+"\r\n").getBytes());
response.flushBuffer();
}
// write the ending boundary
out.write((boundaryTxt + "--\r\n").getBytes());
response.flushBuffer();
out.close();
}
Странная часть заключается в том, что я получаю другой результат в зависимости от навигатора. Ничего не происходит в Chrome (посмотрел на консоль) и в Firefox, я получил приглашение для загрузки для каждого файла, но у него нет нужного типа или правильного имени (ничего в консоли тоже).
Есть ошибки в моем коде? Если нет, есть ли альтернатива?
Редактировать
Я также видел этот пост: Unable to send a multipart/mixed request to spring MVC based REST service
Редактировать 2
Содержание этого файла, что я хочу, но почему не может Я получаю правильное имя и почему хром не может скачать что-нибудь?
Вы можете загрузить петлю на запросы в JS, и после каждого запроса закончена новая загрузка запускается. Я думаю, что это кажется проще, чем взломать, чтобы запускать несколько загрузок. –
@WeareBorg У меня есть только базовые знания в js, можете ли вы дать мне некоторые ресурсы для этого? – Whitefret
К сожалению, нет, я разработчик базы данных, даже не знаю JS. Я могу дать вам код для загрузки ZIP, если вы хотите в Java, что у меня есть ... –