Eu escrevi uma aplicação web Java que permite ao usuário baixar arquivos de um servidor. Esses arquivos são muito grandes e, portanto, são compactados juntos antes do download.
Funciona assim:
1. O usuário recebe uma lista de arquivos que correspondem aos seus critérios
2. Se o usuário gostar de um arquivo e quiser fazer o download, ele o selecionará marcando uma checkbox de seleção.
3. O usuário clica em “download”
4. Os arquivos são então compactados e armazenados em um servidor
5. O usuário então apresentou uma página que contém um link para o arquivo zip que pode ser baixado
6. No entanto, ao baixar o arquivo zip, o arquivo baixado é de 0 bytes no tamanho
Eu verifiquei o servidor remoto eo arquivo zip está sendo criado corretamente, tudo o que resta é servir o arquivo do usuário de alguma forma, você pode ver onde eu poderia estar errado, ou sugerir uma maneira melhor de servir o arquivo zip.
O código que cria o link é:
<a href="https://stackoverflow.com/questions/2459799/downloaded-zip-file-returns-zero-has-0-bytes-as-size/ ">Zip File Link
O código que cria a variável zipFileURL é:
public static String zipFiles(ArrayList fileList, String contextRootPath) { //time-stamping Date date = new Date(); Timestamp timeStamp = new Timestamp(date.getTime()); Iterator fileListIterator = fileList.iterator(); String zipFileURL = ""; try { String ZIP_LOC = contextRootPath + "WEB-INF" + SEP + "TempZipFiles" + SEP; BufferedInputStream origin = null; zipFileURL = ZIP_LOC + "FITS." + timeStamp.toString().replaceAll(":", ".").replaceAll(" ", ".") + ".zip"; FileOutputStream dest = new FileOutputStream(ZIP_LOC + "FITS." + timeStamp.toString().replaceAll(":", ".").replaceAll(" ", ".") + ".zip"); ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream( dest)); // out.setMethod(ZipOutputStream.DEFLATED); byte data[] = new byte[BUFFER]; while(fileListIterator.hasNext()) { String fileName = (String) fileListIterator.next(); System.out.println("Adding: " + fileName); FileInputStream fi = new FileInputStream(fileName); origin = new BufferedInputStream(fi, BUFFER); ZipEntry entry = new ZipEntry(fileName); out.putNextEntry(entry); int count; while ((count = origin.read(data, 0, BUFFER)) != -1) { out.write(data, 0, count); } origin.close(); } out.close(); } catch (Exception e) { e.printStackTrace(); } return zipFileURL; }
Um URL não pode acessar nenhum arquivo (diretamente) no WEB-INF. Sugiro usar um servlet para retornar o arquivo de qualquer local em que ele foi salvo
Também sugeriria salvar o arquivo fora do contexto da sua aplicação web