Java Web(13)struts2 file upload 临时文件命名问题

1. strut2 上传文件的功能已经封装好了,只要action类中定义好与表单一致的name的属性就能够轻松获取到上传的文件,html

<!-- enctype="multipart/form-data" 是必须的,若是不添加这个属性,便不能正常上传-->
<form action="upload"  method="post" enctype="multipart/form-data" id="excelForm">
	 <div>
		<label for="excelfileupload">&nbsp;选择 Excel 文件上传&nbsp;</label>
		<input type="file" class="form-control" id="excelfileupload" name="excel" >
		
		<button type="submit"  id="fileUploadModalBtn">上传</button>
	 </div>	
</form>

2. 在上面的表单中,在action类中应该是这样定义java

public class Upload extends ActionSupport {
    //对应input name=excel
    private File excel ;
    // XFileName 用于接收上传文件的文件名
    private String excelFileName;
    // 文件的类型
    private String excelContentType ;
    
    public String execute(){
        // do something 
        return Action.SUCCESS ; 
        
    }
    
    // setter and getter 
}

3. 在成功接收了上传的文件后,文件会被struts默认保存在一个缓存目录中,缓存的目录能够在struts.properties 中修改apache

struts.multipart.saveDir= 你自定义目录

 

4. 而后,出现了一个问题,若是是在eclipse的IDE环境中编码测试,咱们能够在workspace下的api

%eclipse_workspace%\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\

有相应项目目录下找到上传的临时文件,能够发现,上传的文件是*.tmp的,无论是什么文件,一上传就变了*.tmp。若是是上传excel文件 ,而后使用poi来解析,就会出错,由于经过poi的org.apache.poi.ss.usermodel.WorkbookFactory来建立workbook,是抛异常的。必须把文件恢复到相应的文件后缀名。缓存

5. 还一个,在struts 的 Documentation 中就有说起到,要在本身的action中保存好session

When a file is uploaded it will typically be stored in a temporary directory. 
Uploaded files should be processed or moved by your Action class to ensure the data is not lost.

6. 问题又来了,如何在action中获取到项目的路径呢,在action中的session已经被封装成了一个Map<String, Object>的对象,只能往里填充数据和获取数据,这时,咱们需求struts的一个类来为咱们获取到ServletContext,而后就能够getRealPath()了咯。eclipse

这个类是 org.apache.struts2.ServletActionContext 能够经过它的静态方法获取到ServletContext的引用。maven

7.最后 ,就是在相应的目录中使用java.io.File.renameTo()来转存文件,这时须要注意的是,调用了file.renamTo(newFile)后,并非file就变成了新的File的对象的引用 ,而是参数中的newFile持有转存后的文件的File 引用。并且在引用renameTo返回的是boolean,这时应该判断一下,是否转存成功,否则后面的代码中对newFile的引用就会抛异常FileNotFoundException。post

相关文章
相关标签/搜索