クライアントがドロップダウンボックスから「コース」と「課題」を選択し、ボタンをクリックして、そのコース/課題の組み合わせの下にリストされているデータベース内のすべてのファイルをダウンロードできる jsp/サーブレット Web アプリがあります。zip ファイルが添付ファイルとしてブラウザに送信されていないため、サーブレット コードがうまく機能していません。一度に 1 つのファイルをダウンロードするための作業コードはありますが、ファイルを圧縮するためのこのコードに何か問題があります。データベース内のすべてのファイルは、実際には zip ファイル自体であるため、多数の zip ファイルを圧縮しようとしています。これにより、他の形式のファイルを圧縮するのとは異なる方法で処理する必要があるとは思いませんでした。何が欠けているか誰でも見ることができますか?ダウンロードを処理するサーブレットの doGet メソッド コードを次に示します。このコードの多くは、stackoverflow で見つかりました。FileSubmitted オブジェクトは、Blob 自体を含む、データベース内の各ファイルのすべてのファイル情報を含む私の DOA であることに注意してください。
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{}
}