struts2实现文件的上传

网友投稿 712 2022-09-01

struts2实现文件的上传

struts2实现文件的上传

​​jar包选择​​​​文件上传的前提​​​​程序代码​​​​运行结果​​​​文件上传大小的限制​​

​​解决方法​​​​配置input视图​​

​​限制文件上传的类型​​

​​限制上传文件的扩展名​​​​限制上传文件的MIME类型​​​​出错后的中文信息提示​​

​​小提示​​

jar包选择

struts2的基础jar包,其实struts2的上传底层还是使用commons-fileupload和commons-io实现的。

文件上传的前提

表单method必须是postenctype取值必须是multipart/form-data(默认:application/x-page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@taglib uri="/struts-tags" prefix="s"%> 上传页面

动作类:

获取servletContext对象首先使用realPath方法根据一个虚拟目录得到一个真实的目录,把上传的文件放在项目的/WEB-INF/upload文件夹里面。判断/WEB-INF/upload文件夹是否存在,如果不存在,创建新的文件夹。把上传的文件从临时文件(fileupload超过10KB使用磁盘临时文件使用缓存,不足10KB使用内存作为缓存)剪切到/WEB-INF/upload目录下,并重新命名。

public class UploadAction extends ActionSupport //表单上提供的字段 private String username; private File photo; private String photoFileName;//上传的文件名。上传的字段名称+filename private String photoContentType;//上传的文件MIME类型。上传字段名称+ContentType public String upload(){ //1.获取servletContext对象 ServletContext application = ServletActionContext.getServletContext(); //2.调用realPath方法获取根据一个虚拟目录得到的真实目录 String filePath=application.getRealPath("/WEB-INF/upload"); File file=new File(filePath); if(!file.exists()){ file.mkdir(); } photo.renameTo(new File(file,photoFileName)); return null; } public File getPhoto() { return photo; } public void setPhoto(File photo) { this.photo = photo; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPhotoFileName() { return photoFileName; } public void setPhotoFileName(String photoFileName) { this.photoFileName = photoFileName; } public String getPhotoContentType() { return photoContentType; } public void setPhotoContentType(String photoContentType) { this.photoContentType = photoContentType; }}

struts.xml 仅仅配置了一个upload动作,没有返回结果

运行结果

我们上传了一个大小为616KB的图片,成功在/WEB-INF/upload文件夹中找到了。

我们能不能上传更大的呢?这次我们选择一个大小为2116KB的图片。

好像失败了。

为什么我们上传616KB的图片成功,上传2116KB的图片就报错呢?

文件上传大小的限制

解决方法

我们可以在struts.xml中改变default.properties文件中的常量。

设置默认的上传文件大小为3MB.

再次运行一次:

成功的上传了文件。

配置input视图

虽然我们修改了上传的大小范围,但是肯定还有别人上传更大的文件, 我们应该如何修改呢?

为upload动作配置input结果视图,当用户上传了大于限制的文件,再次跳转到上传页面

在upload.jsp页面中添加

标签。

限制文件上传的类型

有时候我们需要用户上传指定的类型,例如图片,音乐等。 这个时候我们可以为上传的-(FileUploadInterceptor)注入相关参数来限制用户上传的文件类型。 在FileUploadInterceptor-类中我们会看到这两个参数

其中

allowedTypeSet是允许上传文件的MIME类型allowedExtensionsSet是允许上传文件的扩展名。使用其对应的set方法为其注入参数。如果我们要限制用户上传的内容为图片

限制上传文件的扩展名

当上传非限定扩展名时:当我们上传了一个txt文档时,有如下错误提示

限制上传文件的MIME类型

当上传非限定的MIME类型:当我们上传了一个txt文档时,有如下错误提示

出错后的中文信息提示

上面上传文件后出错的信息有很多英文,对于用户来说都是很难读懂的,那么如何能够转变为用户能够读懂的信息呢。

解决办法:Struts2中的所有文本提示都是基于国际化的,用国际化消息资源包,把对应的key取值改为中文即可。默认信息提示在:struts2-core.jar\org.apache.struts2\struts-message.properties

配置步骤如下:

运行结果:

小提示

在文件上传时我们还必须要考虑到一些问题。

保证服务器的安全要把上传的文件上传到客户端无法访问的地方。用户没有上传的问题避免文件被覆盖(文件重名问题),让文件名唯一即可避免 同一个文件夹文件过多

按照日期进行打散存贮目录用文件名的hashCode计算打散的存储目录:二级目录

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决自定义拦截器导致默认的拦截器不起作用的问题
下一篇:PHP进阶学习之依赖注入与Ioc容器详解(php容器依赖注入的原理)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~