java jsp中是否有通用的下载所有类型文件的方法?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10702683/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 02:10:45  来源:igfitidea点击:

Is there a common way to download all types of files in jsp?

javahtmljspjakarta-ee

提问by Saravanan

I want to download office files,pdf files,image files,zip files,dll files,exe files based on the user selection.So, I want to download these file types from jsp page.

我想根据用户选择下载office文件、pdf文件、图像文件、zip文件、dll文件、exe文件。所以,我想从jsp页面下载这些文件类型。

This is jsp code snippt:

这是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();
%>

But it raising some error when downloading office files, images files.When i open the downloaded files it says "The File may be Corrupted".

但是在下载办公文件、图像文件时会出现一些错误。当我打开下载的文件时,它会显示“文件可能已损坏”。

Is there any common way to download all types of files in jsp?

有没有什么通用的方法可以在jsp中下载所有类型的文件?

回答by mprivat

Your problem is that the outvariable in a JSP is a JspWriter, which is a character stream and so your binary files get altered. You would be much better off using a servlet directly for this particular purpose.

您的问题是outJSP中的变量是JspWriter,它是一个字符流,因此您的二进制文件会被更改。直接为此特定目的使用 servlet 会好得多。

回答by MaVRoSCy

ok, there are some issues when downloading files from different browsers. My example takes care the handling needed in MSIE and Mozilla type of browsers

好的,从不同浏览器下载文件时会出现一些问题。我的示例负责处理 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;
}

check this out

看一下这个

UPDATED

更新

回答by loknath

The problem is with JSP's "Out.write", which is not capable of writing byte stream...

问题在于 JSP 的“Out.write”,它不能写入字节流......

Replaced jsp file with servlet...

用servlet替换jsp文件...

The code snippet is:

代码片段是:

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());
        }
     }

Now U can download all types of files....

现在你可以下载所有类型的文件....