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