0

ユーザーの選択に基づいて、オフィスファイル、pdfファイル、画像ファイル、zipファイル、dllファイル、exeファイルをダウンロードしたいので、これらのファイルタイプをjspページからダウンロードしたいと思います。

これは jsp コード スニペットです。

<% 
String filename = "Sample1.docx"; 
String filepath = "e:\\temp\\"; 
response.setContentType("APPLICATION/OCTET-STREAM"); 
response.setHeader("Content-Disposition","attachment; filename=\"" + filename + "\""); 

java.io.FileInputStream fileInputStream = new java.io.FileInputStream(filepath + filename);

int i; 
while ((i=fileInputStream.read()) != -1) {
    out.write(i); 
} 
fileInputStream.close();
%>

しかし、Office ファイル、画像ファイルをダウンロードするときにエラーが発生します。ダウンロードしたファイルを開くと、「ファイルが破損している可能性があります」と表示されます。

jspですべてのタイプのファイルをダウンロードする一般的な方法はありますか?

4

3 に答える 3

3

あなたの問題はout、JSP の変数が文字ストリームであるJspWriterであるため、バイナリ ファイルが変更されることです。この特定の目的には、サーブレットを直接使用する方がはるかに優れています。

于 2012-05-22T13:41:22.427 に答える
1

わかりました。別のブラウザからファイルをダウンロードするときにいくつかの問題があります。私の例では、MSIEおよびMozillaタイプのブラウザで必要な処理に注意を払っています

public HttpServletResponse getFile (HttpServletRequest request ,HttpServletResponse httpServletResponse, .......){
          HttpServletResponse response = httpServletResponse;
          InputStream in =/*HERE YOU READ YOUR FILE AS BinaryStream*/

          String filename = "";
          String agent = request.getHeader("USER-AGENT");
          if (agent != null && agent.indexOf("MSIE") != -1)
          {
            filename = URLEncoder.encode(/*THIS IS THE FILENAME SHOWN TO THE USER*/, "UTF8");
            response.setContentType("application/x-download");
            response.setHeader("Content-Disposition","attachment;filename=" + filename);
          }
          else if ( agent != null && agent.indexOf("Mozilla") != -1)
          {
            response.setCharacterEncoding("UTF-8");
            filename = MimeUtility.encodeText(/*THIS IS THE FILENAME SHOWN TO THE USER*/, "UTF8", "B");
            response.setContentType("application/force-download");
            response.addHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
          }


          BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
          byte by[] = new byte[32768];
          int index = in.read(by, 0, 32768);
          while (index != -1) {
              out.write(by, 0, index);
              index = in.read(by, 0, 32768);
          }
          out.flush();

          return response;
}

これをチェックしてください

更新しました

于 2012-05-22T13:47:18.097 に答える
1

問題は、バイトストリームを書き込むことができないJSPの「Out.write」にあります...

jspファイルをサーブレットに置き換えました...

コード スニペットは次のとおりです。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        String filename = (String) request.getAttribute("fileName");
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition",
                "attachment;filename="+filename);

        File file = new File(filename);
        FileInputStream fileIn = new FileInputStream(file);
        ServletOutputStream out = response.getOutputStream();

        byte[] outputByte = new byte[(int)file.length()];
        //copy binary contect to output stream
        while(fileIn.read(outputByte, 0, (int)file.length()) != -1)
        {
        out.write(outputByte, 0, (int)file.length());
        }
     }

これで、すべてのタイプのファイルをダウンロードできます....

于 2012-12-18T06:29:09.420 に答える