笔者最近在捣鼓Struts2的文件上传功能,照着李刚的轻量级J2EE实践书的4.3节上的讲解敲了遍代码,发现图片能够上传成功,但是显示的时候无法显示笔者使用Intellij
Idea14,Struts 2.3.24 整个工程的关键部分如下所示:
index.jsp关键代码如下:
<s:form action = "uploadFile" method="POST" enctype="multipart/form-data"> <s:textfield name = "filename" label = "文件标题"/> <s:file name = "upload" label = "选择文件"/> <s:submit value = "提交"/> </s:form>
Struts2的配置文件如下:
<struts> <constant name="struts.devMode" value="true"/> <constant name="struts.i18n.encoding" value="utf-8"/> <package name="king" extends="struts-default"> <action name="uploadFile" class="actions.UploadAciton"> <result name="success">/success.jsp</result> <result name="input">/index.jsp</result> <param name="savepath">/upload</param> </action> </package> </struts>
UploadAction部分代码如下:
private String filename; private File upload; private String uploadContentType; private String uploadFileName; private String savepath; //省略其他setter和getter public String getSavepath() { return ServletActionContext.getServletContext().getRealPath( "/WEB-INF/" + savepath); } //储存上传的文件 public String execute() throws Exception{ File dir = new File(getSavepath()); if(!dir.exists()) dir.mkdir(); File f = new File(getSavepath() + "\\" + getUploadFileName()); FileOutputStream fos = new FileOutputStream(f); FileInputStream fis = new FileInputStream(getUpload()); byte[] buffer = new byte[1024]; int len = 0; while((len = fis.read(buffer)) > 0){ fos.write(buffer,0,len); } return "success"; }
Success.jsp页面部分代码如下
<s:property value = "filename"/> <img src="<s:property value = "'upload/'+ uploadFileName"/>"/>
实际运行中Action中getsavepath路径为:D:\JavaCode\Struts2FileTest\out\artifacts\Struts2FileTest_war_exploded\WEB-INF\upload
可能是客户端无法直接访问WEB-INF中的资源,我在Action中将savepath改为ServletActionContext.getServletContext().getRealPath( "/" + savepath)
即将储存目录从WEB-INF中提出来,发现文件能够成功上传,而且在前台页面也能完整显示,而且将工程从Tomcat中移除部署后,上传的文件依然存在,不是临时性的,这一
点在实际工程中很重要,我觉得是Action中先通过getRealPath取得工程所在文件夹的绝对路径,存储上传文件的时候按绝对路径存储,在视图页面中读取时,则按相对路径读取
至此,Struts2的文件上传功能已经有了一个相对完整的解决方案,在这里分享给广大初学者,学习Struts2的路上一起加油!
附上工程结构目录:
实际存储目录