小编典典

使用servlet,如何从数据库下载多个文件并压缩它们以供客户端下载

jsp

我有一个jsp / servlet
Web应用程序,客户端可以在其中通过下拉框选择“课程”和“作业”,然后单击一个按钮以下载数据库中该课程/作业组合下列出的所有文件。Servlet代码无法正常工作,因为zip文件没有作为附件发送到浏览器。我确实有一次可以下载一个文件的工作代码,但是此代码在压缩文件时遇到了麻烦。数据库中的所有文件实际上都是zip文件本身,因此我尝试将一堆zip文件压缩。我认为这不需要像压缩其他任何格式的文件那样对待它们。谁能看到缺失的东西?这是我的servlet中处理下载的doGet方法代码。大部分代码是在stackoverflow上找到的。请注意,FileSubmitted对象是我的DOA,其中包含数据库中每个文件的所有文件信息,包括Blob本身:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    List<FileSubmitted> fileList = new ArrayList<FileSubmitted>();
    String course= request.getParameter("course");
    String assignment = request.getParameter("assignment");

    java.sql.PreparedStatement pstmt = null;
    java.sql.Connection conn = null;
    ResultSet rs;
    String queryString;

    try {
        conn = ConnectionManager.getConnection();
        conn.setAutoCommit(false);

        queryString = "SELECT * FROM files WHERE courseID=\""+course+"\" AND assignmentID=\""+assignment+"\";";
        pstmt = conn.prepareStatement(queryString);
        rs = pstmt.executeQuery(queryString);
        while(rs.next())
        {
            fileList.add(new FileSubmitted(rs.getString("username"),
                                           rs.getString("courseID"),
                                           rs.getString("assignmentID"),
                                           rs.getString("fileName"),
                                           rs.getString("mimeType"),
                                           (Blob) rs.getBlob("contents")));
        }


        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 (FileSubmitted file : fileList)
            {
                InputStream input = null;
                try {
                        input = new BufferedInputStream(file.getContents().getBinaryStream(), DEFAULT_BUFFER_SIZE);
                        output.putNextEntry(new ZipEntry(file.getFileName()));
                        for (int length = 0; (length = input.read(buffer)) > 0;)
                        {
                            output.write(buffer, 0, length);
                        }
                    }//try
                    catch (SQLException e) {e.printStackTrace();}
                    finally{}
                    output.closeEntry();
            }//for
          }//try
          finally{}
     } 
     catch (Exception e1) {e1.printStackTrace();}
     finally{}
}

阅读 249

收藏
2020-06-10

共1个答案

小编典典

万一这对其他人有帮助,我找到了问题的答案。上面发布的代码实际上非常适合从数据库下载多个文件并创建一个zip文件供客户端下载。问题是我正在通过ajax调用servlet,显然您无法通过ajax调用下载文件。因此,我更改了jsp页面以通过提交表单来调用servlet,然后将下载完美地传递到浏览器。

2020-06-10