欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

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>密&nbsp;&nbsp;码:<input type="password" value="" name="psw"><br>头&nbsp;&nbsp;像:<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处理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。