以前感觉文件上传不怎么会,都是从网上粘贴的代码就行了,这两天学习了下Struts2的文件上传,感觉很好用啊!记录以便己用。
在JavaEE中的文件上传需要注意一点的是就是:表单的enctype属性了。
enctype主要有三种属性:
1、application/x-www-form-urlencoded:这个是默认的编码方式,它只处理表单域中的value值,采用这种方式会把表单域中的值处理成URL的形式。
2、multipart/form-data:这种方式会以二进制的方式来处理表单中的数据,它也会把文件域指定的文件封装到请求参数中去。
3、text/plain:当表单action属性为mailto:URL的形式的时候使用它比较方便,它主要是用于直接通过表单发送邮件的情况。
使用Struts2上传文件主要依赖的组件是common-fileupload.jar和common-io-*.jar,而且在JSP中的文件类型的Input中,在Struts2中相对应着三个属性值分别为:文件类型:***,String类型:***FileName,String类型:***ContentType
JSP中表单如下:
<s:form action="addPic" method="post" enctype="multipart/form-data"> <s:textfield name="picName" label="图片名" /> <s:file name="pic" label="请选择文件" /> <s:submit value="提交" /> </s:form>
提交给Struts2的Action
public class AddPicAction extends ActionSupport { private String picName; //每个上传的文件域需要封装三个字段域 private File pic; //对应上传文件本身 private String picFileName; //对应上传文件的原始名字 private String picContentType; //对应上传文件的类型 @Override public String execute() throws Exception{ //这里主要是通过IO流实现文件的读写 String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload"); String newFileName = UUID.randomUUID().toString()+ picFileName.substring(picFileName.lastIndexOf(".")); //打印一下文件保存的路径 System.out.println(uploadPath+"/"+newFileName); //IO输入流通过FileInputStream将文件从盘中读进来 FileInputStream is = new FileInputStream(pic); //通过FileOutputStream将文件写到我们要保存的路径下 FileOutputStream os = new FileOutputStream(uploadPath +"/"+newFileName); byte[] buff = new byte[1024]; int len = 0; while((len = is.read(buff))>0){ os.write(buff, 0, len); } is.close(); os.close(); return SUCCESS; } //这里字段的setter和getter方法就省略啦! }
之后通过struts2的配置文件跳转到相应的页面就行了,然后还需要对上传文件进行过滤,肯定不能让什么文件都能上传,那样相当不安全吧!
Struts2给我们提供了一个fileUpload拦截器,使用相当方便,我只需要在Strtus2的配置文件中引入相应的拦截器就行了:如下:
<action name="addPic" class="struts2.AddPicAction"> <interceptor-ref name="fileUpload"> <!-- 设置允许上传的文件类型 --> <param name="allowedTypes">image/jpeg,image/png, image/gif,image/pjpeg</param> <!-- 设置允许上传文件的大小为:20K --> <param name="maximumSize">20000</param> </interceptor-ref> <!-- 还需要系统默认的拦截器 --> <interceptor-ref name="defaultStack" /> <result name="input">upload.jsp</result> <result>success.jsp</result> </action>
这个地方注意的一点是引入了fileUpload拦截器之后,系统默认的拦截器就不起作用了,这时还需要我们手动的把defaultStack引入进去。
如果上传文件不符合我们要求的就会报错,系统会默认提示错误,但是那都是英文的,对于我们使用汉语的来说不是一件好事啊!所以我们需要把英文转换成汉语,我需要建一个国际化文件比如:message_zh_CN.properties我们可以把报错的信息写进去:
struts.messages.error.content.type.not.allowed是提示文件不是允许的类型
struts.messages.error.file.too.large是提示文件太大
struts.messages.error.uploading是提示未知错误
这样拦截器就完成了!