下载文件时获取附加文件内容的 jsp 源代码

Getting the jsp source code appended with the file content when I download files

我正在使用 Struts2 框架在 Java 中开发文件 upload/download 功能,我们正在从远程服务器路径上传和下载。当我使用本地路径检查本地计算机上的功能时,一切似乎都工作正常,本地路径是我下载和上传任何格式文件的目的地路径。开发环境有JBoss台服务器。 但是当我 运行 在产品环境中进行相同的操作时,应用程序部署在 Weblogic 服务器中,.txt、.csv、.html 的文件(基本上是文本格式文件)有我的 jsp 源代码附加到文件内容。 下面是我用来下载的代码:

BufferedOutputStream bout=null;
FileInputStream inStream = null;
byte[] buffer = null;

try {   
    inStream = new FileInputStream(path+File.separator+filename);       
    buffer = new byte[8192];
    String extension = "";
    int pos = filename.lastIndexOf(".");
    if (pos > 0) 
        extension = filename.substring(pos+1);

    int bytesRead = 0, bytesBuffered = 0;   

    response.setContentType("application/octet-stream");
    response.setHeader("content-disposition", "attachment; filename="+ filename);               
    bout = new BufferedOutputStream(response.getOutputStream());

    while((bytesRead = fistrm.read(buffer)) > -1){                  
        bout.write(buffer, 0, bytesRead);
        bytesBuffered += bytesRead;
        if(bytesBuffered > 1048576){
            bytesBuffered = 0;
            bout.flush();
        }

    }           
} catch (IOException e) {
    log.error(Logger.getStackTrace(e));         
} finally {             
    if(bout!=null){
        bout.flush();
        bout.close();
    }
    if(inStream!=null)
        inStream.close();               

}   

我尝试过针对扩展使用不同的响应内容类型,但没有任何帮助。 似乎在从输入流写入之前,输出流中就有 jsp 源代码。

任何人都可以提出解决方案并解释为什么会这样吗?

这是因为您直接在输出流中写入,然后返回 struts 结果,即您的 JSP。您正在使用一个动作,就好像它是一个 servlet,但事实并非如此。

在 Struts2 中,要实现您的目标,您需要使用 Stream result 类型,如以下答案所述:

否则,如果你想绕过框架机制,自己手动写入outputStream(有极少数情况有用,like downloading dynamically created ZIP), then you must return the NONE result .

Returning ActionSupport.NONE (or null) from an Action class method causes the results processing to be skipped. This is useful if the action fully handles the result processing such as writing directly to the HttpServletResponse OutputStream.

但我强烈建议您使用 Stream 结果,这是标准方式。