struts2学习笔记之十七(上传文件)
2015-06-02 21:30
483 查看
文件上传
传统的文件上传
(1)需要将form设置为multipart/form-data;此时会将整个表单以二进制流的方式提交;接下来就无法将通过request.getParameter()来获取请求参数。(2)需要启用一个文件上传组件(SmartUpload,Common-FileUpload等)
(3)Servlet通过文件上传组件来获取请求参数,获取上传文件。 得到上传文件之后,以IO流的方式把文件写入磁盘
Servlet3.0之后的文件上传
只需要增加一个@MultipartConfig修饰Servlet。接下来就可使用request.getParameter()获取普通请求参数。
用request.getPart()获取上传文件
得到上传文件之后,以IO流的方式把文件写入磁盘
strust2文件上传
底层支持在struts2的struts.properties配置文件中,配置有文件上传的上传解析器
struts.multipart.parser=cos //指定使用COS文件上传解析器
struts.multipart.parser=pell //指定使用pell文件上传解析器
struts.multipart.parser=jakarta //默认使用Common-FileUpload文件上传解析器
步骤:
1、与文件上传域的name同名的,类型为File的field.
2、文件上传域的name+FileName,类型为String的field
3、名为文件上传域的name+ContentType,类型为String的field
4、其他的请求参数和以前一样,即对应一个域
5、用IO流写入服务器磁盘即可。
文件过滤
struts2提供了一个文件上传的拦截器,通过配置该拦截器可以轻松实现文件过滤。struts2中的文件上传的过滤器是fileUpload,为了该拦截器起作用,只需要在该Action中配置该拦截器即可。配置fileUpload拦截器时,可以为其制定两个参数:
allowedTypes
maximumSize
手动过滤文件类型
如果需要判断文件类型,通过xxxContentType属性即可
如果需要判断文件大小,通过File的xxx属性获取文件大小,判断文件大小符合即可
当文件类型或文件大小不符合要求时,系统返回指定逻辑视图(如:input)
文件过滤的种类
A:只允许上传指定类型的文件
B:只允许上传指定大小的文件
文件过滤的方式:
A:在Action中通过代码手动过滤(File类型的field和xxxContentType)
B:直接使用fileUpload的拦截器进行过滤(需要进行配置)
(1)启用fileUpload拦截器(allowedTypes,maximumSize)。文件过滤失败时,struts2会返回input逻辑视图名
(2)需要为input逻辑视图配置物理视图资源
更改错误默认的提示
上传失败后,系统会返回一个input的逻辑视图,在该视图中,对应的页面通过如下代码输出错误提示:
<s:fielderror>
如果需要使用自定义错误提示,下面是本应用中国际化资源文件的代码,应该提供如下国际化信息。
struts.messages.error.file.too.large=”上传文件太大”
struts.messages.error.uploading=”文件上传错误”
struts.messages.error.content.type.not.allowed=”类型不允许”
通过上述国际化消息的key就可以实现自定义的错误提示
实例
上传页面<!--必须指定enctype,且必须指定为multiple/form-data--> <s:form action="addPic" enctype="multipart/form-data"> <s:textfield name="picName" label="图片名"/> <s:file name="pic" label="请上传图片"/> <s:submit value="提交"/> </s:form>
Action
//为了包装上传的文件,需要三个域 //文件本身,类型File //原始文件名,类型String //文件类型,类型String public class AddPic extends ActionSupport { /** * */ private static final long serialVersionUID = 1L; //用户填写的文件上传名,封装的是textfield private String picName; //每一个file上传域对应3个封装域(文件本身,原始文件名,文件类型) private File pic; //对应文件上传本身 private String picFileName; //对应文件的原始文件名 private String picContentType; //对应文件的上传类型 //setter和getter @Override public String execute() throws IOException{ //获取文件路径 String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload"); //文件保存的新文件名(UUID+原文件后缀) String newFileName = UUID.randomUUID().toString() + picFileName.substring(picFileName.lastIndexOf('.')); //打印文件路径,观察是否上传成功 //System.out.println(uploadPath+"/" + newFileName); FileInputStream is = new FileInputStream(pic); FileOutputStream os = new FileOutputStream(uploadPath + "/" + newFileName); byte[] buff = new byte[1024]; int hasRead = 0; while((hasRead = is.read(buff)) > 0 ){ os.write(buff,0,hasRead); } is.close(); os.close(); //System.out.println(pic + "\n" + picFileName+"\n"+picContentType); //============至此文件上传已经成功,可以在upload文件夹中看到================== //============下面使用内存管理模拟数据库管理上传文件======================= //上传成功之后添加数据到"数据库"中 PicService.add(new Picture(picName,newFileName)); return SUCCESS; } }
配置拦截器
<action name="addPic" class="org.struts2.action.AddPic"> <!-- 为了实现文件过滤,只需要在action里添加fileUpload拦截器即可,其他地方不用变 --> <interceptor-ref name="fileUpload"> <param name="allowedTypes">image/png,image/jpeg,image/pjpeg,image/gif</param> <param name="maximumSize">20000</param> </interceptor-ref> <!-- 默认拦截器 --> <interceptor-ref name="defaultStack"/> <!--文件上传失败 --> <result name="input">/WEB-INF/content/fileUpload.jsp</result> <result type="chain">listPic</result> </action>
上传失败消息的国际化
mess_zh_CN.properties文件内容 struts.messages.error.file.too.large=\u6587\u4EF6\u592A\u5927 struts.messages.error.content.type.not.allowed=\u53EA\u5141\u8BB8jpeg,gif,png\u56FE\u7247\u4E0A\u4F20 配置: <constant name="struts.custom.i18n.resources" value="resources/mess" />
相关文章推荐
- Java Date,long,String 日期转换
- Java学习第一阶段
- 《Java从入门到精通》第一、二章学习笔记
- Java实验三报告
- java.io.Serializable浅析
- java中this的基本的用法
- Java基础知识之Set
- 理解Java对象序列化
- 我是菜鸟:java异常处理总结
- Java中Thread的interrupt()方法
- 算法学习(java实现之字符串)··报数
- springmvc配置DispatcherServlet拦截url注意事项
- 关于Java数组越界的一个诡异问题【leetcode204】
- Java实现归并排序
- 《JAVA与模式》之责任链模式
- 《Java编程思想》学习笔记4——集合容器
- 《Java编程思想》学习笔记3——内部类
- 《Java编程思想》学习笔记2——对象初始化和面向对象特性
- 《Java编程思想》学习笔记1——面向对象和JVM基础
- BucketSort的java实现