Web项目中文件上传Filter处理
最近遇到一個(gè)文件上傳的項(xiàng)目,而且在這個(gè)項(xiàng)目中遇到的文件上傳的次數(shù)還是挺多的,所以就寫了個(gè)Filter過(guò)濾器。這一個(gè)想法還是從一本書上看到的,所以原則上說(shuō)并不是在下原創(chuàng)。不過(guò)因?yàn)檠a(bǔ)充了一點(diǎn)東西,所以,嘿嘿,不說(shuō)了。
首先需要寫個(gè)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;//保存提交的數(shù)據(jù)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進(jìn)行上傳//?設(shè)置編碼upload.setHeaderEncoding(encoding);//?解析上傳的數(shù)據(jù)List<FileItem>?fileItems?=?upload.parseRequest(request);//?遍歷for?(Iterator<FileItem>?it?=?fileItems.iterator();?it.hasNext();){//?獲取當(dāng)前的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);//?保存到系統(tǒng)臨時(shí)文件夾中java.io.File?file?=?new?File(System.getProperty("java.io.tmpdir"),?filename);//?新建文件輸出流OutputStream?ops?=?new?FileOutputStream(file);//?輸出到文件流中ops.write(item.get());//?關(guān)閉文件流ops.close();//?將值放到Map中params.put(item.getFieldName(),?file);}}}catch?(Exception?e){e.printStackTrace();}}}@Overridepublic?Object?getAttribute(String?name){//?如果是上傳文件,則從Map中取值,支持直接獲取文件對(duì)象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,那么該怎樣使用了。放心,在下會(huì)說(shuō)滴:
我們現(xiàn)在先寫一個(gè)簡(jiǎn)單的上傳的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="注冊(cè)"></form> </body>由于樣式什么的沒(méi)有調(diào)整,難看點(diǎn)也是無(wú)所謂的吧!
然后在servlet中使用:
protected?void?doGet(HttpServletRequest?request,?HttpServletResponse?response)?throws?ServletException,?IOException{request.setCharacterEncoding("utf-8");response.setContentType("text/html;?charset=utf-8");//?讀取表單內(nèi)容String?name?=?request.getParameter("uname");String?psw?=?request.getParameter("psw");File?headPic?=?(File)?request.getAttribute("file");FileWriterWrapper?write?=?new?FileWriterWrapper(request,?headPic);????????}大家有沒(méi)有發(fā)現(xiàn),這樣選取表單中的內(nèi)容是比較方便的,那么然后
?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);//?如果路徑不存在,則創(chuàng)建if(!new?File(filename).isDirectory()){System.out.println("文件不存在,正在創(chuàng)建。。。");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);}//?關(guān)閉文件fis.close();fos.close();System.out.println("文件寫入成功");}catch?(IOException?e){System.out.println("文件寫入失敗");e.printStackTrace();}} }接下來(lái),大家看看配置:
<context-param><param-name>filename</param-name><param-value>/imgs</param-value></context-param>看到這,不知道大家有沒(méi)有一個(gè)疑問(wèn),如果表單中的上傳文件有多個(gè),那么怎么辦?如果這樣就需要修改
FileWriterWrapper類了,可以將獲取上下文配置中的路徑放在Servlet中,這樣就可以了,具體操作在下就不書寫了。。
以上內(nèi)容如有錯(cuò)誤,歡迎指出。。。
轉(zhuǎn)載于:https://blog.51cto.com/yinbin99/1840864
總結(jié)
以上是生活随笔為你收集整理的Web项目中文件上传Filter处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 史上最详细“截图”搭建Hexo博客——F
- 下一篇: 快速学习Android开发知识点总结(磨