Question

I have the below code got from mkyong, to zip files on local. But, my requirement is to zip files on server and need to download that. Could any one help.

code wrote to zipFiles:

public void zipFiles(File contentFile, File navFile)
{
    byte[] buffer = new byte[1024];

    try{
        // i dont have idea on what to give here in fileoutputstream
        FileOutputStream fos = new FileOutputStream("C:\\MyFile.zip");
        ZipOutputStream zos = new ZipOutputStream(fos);
        ZipEntry ze= new ZipEntry(contentFile.toString());
        zos.putNextEntry(ze);
        FileInputStream in = new FileInputStream(contentFile.toString());

        int len;
        while ((len = in.read(buffer)) > 0) {
            zos.write(buffer, 0, len);
        }

        in.close();
        zos.closeEntry();

        //remember close it
        zos.close();

        System.out.println("Done");

    }catch(IOException ex){
       ex.printStackTrace();
    }
}

what could i provide in fileoutputstream here? contentfile and navigationfile are files i created from code.

Était-ce utile?

La solution

If your server is a servlet container, just write an HttpServlet which does the zipping and serving the file.

You can pass the output stream of the servlet response to the constructor of ZipOutputStream and the zip file will be sent as the servlet response:

ZipOutputStream zos = new ZipOutputStream(response.getOutputStream());

Don't forget to set the response mime type before zipping, e.g.:

response.setContentType("application/zip");

The whole picture:

public class DownloadServlet extends HttpServlet {

    @Override
    public void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "attachment; filename=data.zip");

        // You might also wanna disable caching the response
        // here by setting other headers...

        try ( ZipOutputStream zos = new ZipOutputStream(response.getOutputStream()) ) {
            // Add zip entries you want to include in the zip file
        }
    }
}

Autres conseils

Try this:

@RequestMapping(value="download", method=RequestMethod.GET)
public void getDownload(HttpServletResponse response) {

    // Get your file stream from wherever.
    InputStream myStream = someClass.returnFile();

    // Set the content type and attachment header.
    response.addHeader("Content-disposition", "attachment;filename=myfilename.txt");
    response.setContentType("txt/plain");

    // Copy the stream to the response's output stream.
    IOUtils.copy(myStream, response.getOutputStream());
    response.flushBuffer();
}

Reference

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top