Java Web(13)struts2 file upload 临时文件命名问题
2015-12-17 10:10
465 查看
1. strut2 上传文件的功能已经封装好了,只要action类中定义好与表单一致的name的属性就可以轻松获取到上传的文件,
2. 在上面的表单中,在action类中应该是这样定义
3. 在成功接收了上传的文件后,文件会被struts默认保存在一个缓存目录中,缓存的目录可以在struts.properties 中修改
4. 然后,出现了一个问题,如果是在eclipse的IDE环境中编码测试,我们可以在workspace下的
有相应项目目录下找到上传的临时文件,可以发现,上传的文件是*.tmp的,不管是什么文件,一上传就变了*.tmp。如果是上传excel文件 ,然后使用poi来解析,就会出错,因为通过poi的org.apache.poi.ss.usermodel.WorkbookFactory来创建workbook,是抛异常的。必须把文件恢复到相应的文件后缀名。
5. 还一个,在struts 的 Documentation 中就有提及到,要在自己的action中保存好
6. 问题又来了,如何在action中获取到项目的路径呢,在action中的session已经被封装成了一个Map<String, Object>的对象,只能往里填充数据和获取数据,这时,我们需求struts的一个类来为我们获取到ServletContext,然后就可以getRealPath()了咯。
这个类是 org.apache.struts2.ServletActionContext 可以通过它的静态方法获取到ServletContext的引用。
7.最后 ,就是在相应的目录中使用java.io.File.renameTo()来转存文件,这时需要注意的是,调用了file.renamTo(newFile)后,并不是file就变成了新的File的对象的引用 ,而是参数中的newFile持有转存后的文件的File 引用。而且在引用renameTo返回的是boolean,这时应该判断一下,是否转存成功,不然后面的代码中对newFile的引用就会抛异常FileNotFoundException。
<!-- enctype="multipart/form-data" 是必须的,如果不添加这个属性,便不能正常上传--> <form action="upload" method="post" enctype="multipart/form-data" id="excelForm"> <div> <label for="excelfileupload"> 选择 Excel 文件上传 </label> <input type="file" class="form-control" id="excelfileupload" name="excel" > <button type="submit" id="fileUploadModalBtn">上传</button> </div> </form>
2. 在上面的表单中,在action类中应该是这样定义
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 中修改
struts.multipart.saveDir= 你自定义目录
4. 然后,出现了一个问题,如果是在eclipse的IDE环境中编码测试,我们可以在workspace下的
%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中保存好
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()了咯。
这个类是 org.apache.struts2.ServletActionContext 可以通过它的静态方法获取到ServletContext的引用。
7.最后 ,就是在相应的目录中使用java.io.File.renameTo()来转存文件,这时需要注意的是,调用了file.renamTo(newFile)后,并不是file就变成了新的File的对象的引用 ,而是参数中的newFile持有转存后的文件的File 引用。而且在引用renameTo返回的是boolean,这时应该判断一下,是否转存成功,不然后面的代码中对newFile的引用就会抛异常FileNotFoundException。
相关文章推荐
- 在java中怎么理解“用instanceof操作符判断父类对象是否为子类的一个实例”?
- Android Studio导入eclipse项目报错“cannot resolve symbol R“的解决办法
- Java 工程师成神之路
- eclipse +maven实现多模块项目struts+spring+mybatis
- 【Java EE 学习 71 上】【数据采集系统第三天】【增加页面】【增加问题】【编辑页面,编辑问题】
- SpringMvc多视图整合配置教程(jsp、velocity、freemarker)
- 深入分析JavaWeb Item25 -- 自定义标签开发案例和打包自定义标签库
- Java中 VO、 PO、 BO、 QO、DAO、POJO的概念
- java.lang.RuntimeException: Could not generate secret
- javabean总结( 转载)
- 计算java文件有多少行注释行,正常代码行,空白行的程序,swing做的
- Spring上传文件
- SpringMVC+MyBatis+JMS+JTA(分布式事务)
- 用ant进行编译和打包(java)
- java 依赖jar包如何使用
- spring-security-oauth2服务端和client端入门01--代码编译及服务启动
- Java中事件分发线程
- Mybatis3源码分析(01)-前期准备
- 记录ScheduledExecutorService使用中不工作情况
- 为什么Java字符串是不可变对象?