当前位置:
首页 >
Web项目中文件上传Filter处理
发布时间:2025/4/5
41
豆豆
生活随笔
收集整理的这篇文章主要介绍了
Web项目中文件上传Filter处理
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
最近遇到一个文件上传的项目,而且在这个项目中遇到的文件上传的次数还是挺多的,所以就写了个Filter过滤器。这一个想法还是从一本书上看到的,所以原则上说并不是在下原创。不过因为补充了一点东西,所以,嘿嘿,不说了。
首先需要写个Filter:
package yin.filter; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.MultipartConfig; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.fileupload.DiskFileUpload; import org.apache.commons.fileupload.FileItem; public class Uploadfilter implements Filter {private String encoding;@Overridepublic void destroy(){}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException{UploadRequestWrapper uploadRequestWrapper = new UploadRequestWrapper((HttpServletRequest)request);chain.doFilter(uploadRequestWrapper, response);}@Overridepublic void init(FilterConfig config) throws ServletException{encoding = config.getServletContext().getInitParameter("encoding");if (encoding == null){encoding = "utf-8";}}class UploadRequestWrapper extends HttpServletRequestWrapper{// 文件头类型private static final String MULTIPART_HEADER = "Content-type";// 是否是上传文件private boolean multipart;//保存提交的数据private Map<String, Object> params = new HashMap<String,Object>();@SuppressWarnings("deprecation")public UploadRequestWrapper(HttpServletRequest request){super(request);// 判断是否是上传文件multipart = request.getHeader(MULTIPART_HEADER) != null && request.getHeader(MULTIPART_HEADER).startsWith("multipart/form-data");// 如果是上传文件if (multipart){try{DiskFileUpload upload = new DiskFileUpload();// 使用apache进行上传// 设置编码upload.setHeaderEncoding(encoding);// 解析上传的数据List<FileItem> fileItems = upload.parseRequest(request);// 遍历for (Iterator<FileItem> it = fileItems.iterator(); it.hasNext();){// 获取当前的FileItemFileItem item = (FileItem) it.next();// 如果是文本域if (item.isFormField()){params.put(item.getFieldName(), item.getString(encoding));}else{// 替换特殊字符String filename = item.getName().replace("\\", "/");filename = filename.substring(filename.lastIndexOf("/")+1);// 保存到系统临时文件夹中java.io.File file = new File(System.getProperty("java.io.tmpdir"), filename);// 新建文件输出流OutputStream ops = new FileOutputStream(file);// 输出到文件流中ops.write(item.get());// 关闭文件流ops.close();// 将值放到Map中params.put(item.getFieldName(), file);}}}catch (Exception e){e.printStackTrace();}}}@Overridepublic Object getAttribute(String name){// 如果是上传文件,则从Map中取值,支持直接获取文件对象if (multipart && params.containsKey(name)){return params.get(name);}return super.getAttribute(name);}@Overridepublic String getParameter(String name){// 如果是上传文件,则从Map中取值,if (multipart && params.containsKey(name)){return params.get(name).toString();}return super.getParameter(name);}} }好了,Filter写完了,那么就修改配置文件web.xml吧,如下:
<filter><filter-name>Uploadfilter</filter-name><filter-class>yin.filter.Uploadfilter</filter-class></filter><filter-mapping><filter-name>Uploadfilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>以上只是文件上传的Filter,那么该怎样使用了。放心,在下会说滴:
我们现在先写一个简单的上传的jsp文件,
<body><!-- 包含上传文件的表单 --><form action="upload" method="post" enctype="multipart/form-data">用户名:<input type="text" value="" name="uname"><br>密 码:<input type="password" value="" name="psw"><br>头 像:<input type="file" name="file"><br><input type="submit" value="注册"></form> </body>由于样式什么的没有调整,难看点也是无所谓的吧!
然后在servlet中使用:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{request.setCharacterEncoding("utf-8");response.setContentType("text/html; charset=utf-8");// 读取表单内容String name = request.getParameter("uname");String psw = request.getParameter("psw");File headPic = (File) request.getAttribute("file");FileWriterWrapper write = new FileWriterWrapper(request, headPic); }大家有没有发现,这样选取表单中的内容是比较方便的,那么然后
FileWriterWrapper write = new FileWriterWrapper(request, headPic);这一行代码就是将读取到的文件写入到硬盘中了,
package yin.usual; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; public class FileWriterWrapper {public FileWriterWrapper(){// TODO Auto-generated constructor stub}// 文件写入的方法public FileWriterWrapper(HttpServletRequest request,File file){ try{// 读取上下文配置,获取路径ServletContext context = request.getServletContext();String filename = context.getInitParameter("filename");// 获取文件保存路径filename = context.getRealPath(filename);// 如果路径不存在,则创建if(!new File(filename).isDirectory()){System.out.println("文件不存在,正在创建。。。");new File(filename).mkdirs();}// 获取文件名String picname = file.getName().replace("/", "\\");picname = picname.substring(picname.lastIndexOf("\\")+1, picname.length());// 获取文件保存位置String path = filename +"\\"+picname;System.out.println("文件保存在:" + path);FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(path);byte[] bs = new byte[1024*1024*4];int len = 0;while((len = fis.read(bs)) != -1){fos.write(bs, 0, len);}// 关闭文件fis.close();fos.close();System.out.println("文件写入成功");}catch (IOException e){System.out.println("文件写入失败");e.printStackTrace();}} }接下来,大家看看配置:
<context-param><param-name>filename</param-name><param-value>/imgs</param-value></context-param>看到这,不知道大家有没有一个疑问,如果表单中的上传文件有多个,那么怎么办?如果这样就需要修改
FileWriterWrapper类了,可以将获取上下文配置中的路径放在Servlet中,这样就可以了,具体操作在下就不书写了。。
以上内容如有错误,欢迎指出。。。
转载于:https://blog.51cto.com/yinbin99/1840864
总结
以上是生活随笔为你收集整理的Web项目中文件上传Filter处理的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 史上最详细“截图”搭建Hexo博客——F
- 下一篇: Redux 莞式教程 之 简明篇