【问题解决】使用Strust2文件上传图片无法显示

时间:2022-09-19 17:07:09

笔者最近在捣鼓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的路上一起加油!

附上工程结构目录:

【问题解决】使用Strust2文件上传图片无法显示

实际存储目录

【问题解决】使用Strust2文件上传图片无法显示