一尘不染

下载文件时获取附带文件内容的j​​sp源代码

jsp

我正在使用Struts2框架在Java中使用文件上载/下载功能,在该处我们要从远程服务器路径上载和从中下载。当我在本地计算机上使用本地路径作为目标路径(从我要下载的位置以及要上传任何格式的文件的目的地)检查功能时,一切似乎都正常。开发环境具有JBoss服务器。但是,当我在将应用程序部署在Weblogic服务器中的prod
env上运行相同的文件时,.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源代码。

任何人都可以提出解决方案并解释为什么会发生这种情况吗?


阅读 150

收藏
2020-06-10

共1个答案

一尘不染

之所以发生这种情况,是因为您直接在输出流中编写代码,然后返回一个struts结果,即您的JSP。您正在使用一个动作,就好像它是一个servlet,不是。

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

否则
,如果您想绕开框架机制并自己手动写入outputStream(在极少数情况下有用,例如下载动态创建的ZIP),那么
必须返回NONE结果

ActionSupport.NONE从Action类方法返回(或为null)会导致结果处理被跳过。如果该操作完全处理了结果处理(例如直接写入HttpServletResponse
OutputStream),则此方法很有用。

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

2020-06-10