我正在使用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源代码。
任何人都可以提出解决方案并解释为什么会发生这种情况吗?
之所以发生这种情况,是因为您直接在输出流中编写代码,然后返回一个struts结果,即您的JSP。您正在使用一个动作,就好像它是一个servlet,不是。
在Struts2中,要实现您的目标, 您需要使用 Stream结果类型,如以下答案所述
否则 ,如果您想绕开框架机制并自己手动写入outputStream(在极少数情况下有用,例如下载动态创建的ZIP),那么 必须返回NONE结果。
NONE
ActionSupport.NONE从Action类方法返回(或为null)会导致结果处理被跳过。如果该操作完全处理了结果处理(例如直接写入HttpServletResponse OutputStream),则此方法很有用。
ActionSupport.NONE
但是我强烈建议您使用Stream结果,这是标准方法。