0

working again with Java EE.

In example

  1. On servlet I have byte[] fileContent ---->(file.txt)
  2. I try to add it to zip file
  3. set servlet as

    response.setContentType("Content-type: text/zip");
    response.setHeader("Content-Disposition",
            "attachment; filename=mytest.zip");
    
    // List of files to be downloaded
    List files = new ArrayList();
    files.add(new File("C:/first.txt"));
    
    ServletOutputStream out = response.getOutputStream();
    ZipOutputStream zos = new ZipOutputStream(new BufferedOutputStream(out));
    
    for (File file : files) {
    
        System.out.println("Adding " + file.getName());
        zos.putNextEntry(new ZipEntry(file.getName()));
    
        // Get the file
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(file);
    
        } catch (FileNotFoundException fnfe) {
            // If the file does not exists, write an error entry instead of
            // file
            // contents
            zos.write(("ERRORld not find file " + file.getName())
                    .getBytes());
            zos.closeEntry();
            System.out.println("Couldfind file "
                    + file.getAbsolutePath());
            continue;
        }
    
        BufferedInputStream fif = new BufferedInputStream(fis);
    
        // Write the contents of the file
        int data = 0;
        while ((data = fif.read()) != -1) {
            zos.write(data);
        }
        fif.close();
    
        zos.closeEntry();
        System.out.println("Finishedng file " + file.getName());
    }
    
    zos.close();
    

    } }

I have problem with the second point. I try several of solutions but all of them hardly working with my servlet or didn't work.

Could somebody show me on example how add file as array of bytes to zip and return on servlet as atachment? Thanks for any tips and advices

--post edit

I try something like that, but how can I add byte[] instead of file.

Adamo
  • 586
  • 1
  • 9
  • 28

1 Answers1

0

Here's example of solution:

public class ZipFileServlet extends HttpServlet {

private static final int DEFAULT_BUFFER_SIZE = 10240; // 10KB.
private YourFileDAO yourFileDAO = YourDAOFactory.getYourFileDAO();

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
{
    String[] fileIds = request.getParameterValues("fileId");
    response.setContentType("application/zip");
    response.setHeader("Content-Disposition", "attachment; filename=\"allfiles.zip\"");
    ZipOutputStream output = null;
    byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];

    try {
        output = new ZipOutputStream(new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE));

        for (String fileId : fileIds) {
            YourFileItem item = yourFileDAO.find(fileId);
            if (item == null) continue; // Handle yourself. The fileId may be wrong/spoofed.
            InputStream input = null;

            try {
                input = new BufferedInputStream(item.getInputStream(), DEFAULT_BUFFER_SIZE);
                output.putNextEntry(new ZipEntry(item.getName()));
                for (int length = 0; (length = input.read(buffer)) > 0;) {
                    output.write(buffer, 0, length);
                }
                output.closeEntry();
            } finally {
                if (input != null) try { input.close(); } catch (IOException logOrIgnore) { /**/ }
            }
        }
    } finally {
        if (output != null) try { output.close(); } catch (IOException logOrIgnore) { /**/ }
    }
}

 }
Adamo
  • 586
  • 1
  • 9
  • 28