Java 下载文件时获取附加有文件内容的jsp源代码
我正在使用Struts2框架在Java中开发一个文件上传/下载功能,我们可以通过远程服务器路径上传和下载文件。当我在本地机器上检查功能时,所有这些似乎都正常工作,本地路径是我下载文件和上传任何格式文件的目标路径。开发环境有JBoss服务器。 但是,当我在prod env上运行相同的程序时,应用程序部署在Weblogic server中,文件.txt、.csv、.html(基本上是文本格式文件)将我的jsp源代码附加到文件内容中。 以下是我用于下载的代码:Java 下载文件时获取附加有文件内容的jsp源代码,java,jsp,jboss,struts2,weblogic,Java,Jsp,Jboss,Struts2,Weblogic,我正在使用Struts2框架在Java中开发一个文件上传/下载功能,我们可以通过远程服务器路径上传和下载文件。当我在本地机器上检查功能时,所有这些似乎都正常工作,本地路径是我下载文件和上传任何格式文件的目标路径。开发环境有JBoss服务器。 但是,当我在prod env上运行相同的程序时,应用程序部署在Weblogic server中,文件.txt、.csv、.html(基本上是文本格式文件)将我的jsp源代码附加到文件内容中。 以下是我用于下载的代码: BufferedOutputStream
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();
}
我尝试过对扩展使用不同的响应内容类型,但没有任何帮助。
似乎outputstream甚至在从inputstream写入之前就已经包含了jsp源代码
有人能提出一个解决方案并解释为什么会发生这种情况吗?之所以会发生这种情况,是因为您直接在outputstream中编写,然后返回一个struts结果,即您的JSP。您正在使用一个动作,就好像它将是一个servlet,而不是 在Struts2中,要实现您的目标,您需要使用类型,如以下答案所述:
ActionSupport.NONE
(或null)将导致跳过结果处理。如果操作完全处理结果处理,例如直接写入HttpServletResponse OutputStream,这将非常有用
但我强烈建议您使用流结果,即标准方式。谢谢您的回复@Andrea Ligios。返回null而不是jsp页面似乎是可行的。更让我困惑的是,为什么它在我的本地环境中工作而不在prod环境中工作。是不是因为JBoss有某种处理方法。我将尝试使用您提到的流结果方式。