5

クライアントがドロップダウンボックスから「コース」と「課題」を選択し、ボタンをクリックして、そのコース/課題の組み合わせの下にリストされているデータベース内のすべてのファイルをダウンロードできる 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{}
}
4

2 に答える 2

5

これが他の人に役立つ場合に備えて、問題に対する答えを見つけました。上記のコードは、データベースから複数のファイルをダウンロードし、クライアントがダウンロードする zip ファイルを作成する場合に実際に完全に機能します。問題は、私が ajax 経由でサーブレットを呼び出していたことで、どうやら ajax 呼び出し経由でファイルをダウンロードできないようです。そこで、フォームを送信してサーブレットを呼び出すようにjspページを変更すると、ダウンロードがブラウザに完全に送信されました。

于 2013-04-14T16:01:41.687 に答える
3

最初に、すべての zip ファイルを含む zip ファイルを作成します。

ServletOutputStreamの代わりに使用しZipOutputStreamます。

次に、以下のコードを使用します

protected void doGet(final HttpServletRequest request, final HttpServletResponse response) {
        final String filename = "/usr/local/FileName" + ".zip";

        BufferedInputStream buf = null;
        ServletOutputStream myOut = null;

        try {
            myOut = response.getOutputStream();

            File myfile = new File(filename);

            if (myfile.exists()) {
                //myfile.createNewFile();
                //set response headers
                response.setHeader("Cache-Control", "max-age=60");
                response.setHeader("Cache-Control", "must-revalidate");
                response.setContentType("application/zip");

                response.addHeader("Content-Disposition", "attachment; filename=" + filename);

                response.setContentLength((int) myfile.length());

                FileInputStream input = new FileInputStream(myfile);
                buf = new BufferedInputStream(input);
                int readBytes = 0;

                //read from the file; write to the ServletOutputStream
                while ((readBytes = buf.read()) != -1) {
                    myOut.write(readBytes);
                }
            }

        } catch (Exception exp) {
        } finally {
            //close the input/output streams
            if (myOut != null) {
                try {
                    myOut.close();
                } catch (IOException ex) {
                }
            }
            if (buf != null) {
                try {
                    buf.close();
                } catch (IOException ex) {
                }
            }

        }
    }
于 2013-04-12T05:04:23.360 に答える