如何 return 从 Servlet 中的字节数组压缩

How to return zip from bytearray on Servlet

再次使用 Java EE。

例如

  1. 在 servlet 上我有 byte[] fileContent ---->(file.txt)
  2. 我尝试将其添加到 zip 文件
  3. 将 servlet 设置为

    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();
    

    } }

我对第二点有疑问。我尝试了几种解决方案,但所有这些解决方案都无法与我的 servlet 一起使用或无法正常工作。

有人可以举例说明如何将文件作为字节数组添加到 zip 并在 servlet 上添加 return 作为附件吗?感谢任何提示和建议

--post编辑

我尝试了类似的方法,但我怎样才能添加 byte[] 而不是 file。

解决方案示例如下:

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) { /**/ }
    }
}

 }