Я использую три сервлета для обслуживания файлов для скачивания:
- ByteArrayDownloadServlet: используется для небольших файлов, таких как отчеты или файлы из базы данных
- FileDownloadServlet: используется для маленьких и больших файлов
- MultipleFileDownloadServlet: создайте zip-файл с запрошенными файлами и передайте его
Они основаны на следующей реализации:
текст ссылки
Я получил несколько жалоб на испорченные загрузки. Проблема в том, что я не могу смоделировать или найти шаблон в ошибках:
- иногда с большими файлами
- иногда, когда пользователь запрашивает более одного файла для загрузки и zip-файл и создается динамически
- иногда с небольшими файлами, но они запрашиваются многими пользователями одновременно
В вышеупомянутых комментариях к посту есть люди, сообщающие о похожих проблемах, но не имеющие решения. Я также прочитал много тем отсюда, и это ближе, я получил:
текст ссылки
Кто-нибудь сталкивался с подобной проблемой или есть пример кода, который работает?
Спасибо,
Фелипе
@Override
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
HttpSession session = request.getSession();
List<File> selectedFileList = (List<File>) session.getAttribute("selectedFileList");
if(selectedFileList == null)
{
response.sendError(HttpServletResponse.SC_PRECONDITION_FAILED, "Lista de arquivos não informada");
return;
}
response.reset();
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment; filename=\""
+ "atualizacoes_"
+ new Date().getTime() + ".zip" + "\"");
ZipOutputStream output = null;
try
{
output = new ZipOutputStream(response.getOutputStream());
for(File file : selectedFileList)
{
InputStream input = new FileInputStream(file);
output.putNextEntry(new ZipEntry(file.getName()));
byte[] buffer = new byte[DownloadHandler.DEFAULT_BUFFER_SIZE];
int length;
while((length = input.read(buffer)) > 0)
{
output.write(buffer, 0, length);
}
output.closeEntry();
input.close();
}
output.finish();
output.flush();
output.close();
}
catch(Exception e)
{
if(!(e instanceof ClientAbortException))
{
new ExceptionMail(getClass().getSimpleName(), e);
}
}
finally
{
session.removeAttribute("selectedFileList");
}