最近遇到一個(gè)文件上傳的項(xiàng)目,而且在這個(gè)項(xiàng)目中遇到的文件上傳的次數(shù)還是挺多的,所以就寫了個(gè)Filter過濾器。這一個(gè)想法還是從一本書上看到的,所以原則上說并不是在下原創(chuàng)。不過因?yàn)檠a(bǔ)充了一點(diǎn)東西,所以,嘿嘿,不說了。
在建湖等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作定制網(wǎng)站建設(shè),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),成都營銷網(wǎng)站建設(shè),外貿(mào)營銷網(wǎng)站建設(shè),建湖網(wǎng)站建設(shè)費(fèi)用合理。首先需要寫個(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; @Override public void destroy() { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { UploadRequestWrapper uploadRequestWrapper = new UploadRequestWrapper((HttpServletRequest)request); chain.doFilter(uploadRequestWrapper, response); } @Override public 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 Mapparams = new HashMap (); @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 fileItems = upload.parseRequest(request); // 遍歷 for (Iterator it = fileItems.iterator(); it.hasNext();) { // 獲取當(dāng)前的FileItem FileItem 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(); } } } @Override public Object getAttribute(String name) { // 如果是上傳文件,則從Map中取值,支持直接獲取文件對(duì)象 if (multipart && params.containsKey(name)) { return params.get(name); } return super.getAttribute(name); } @Override public String getParameter(String name) { // 如果是上傳文件,則從Map中取值, if (multipart && params.containsKey(name)) { return params.get(name).toString(); } return super.getParameter(name); } } }
好了,F(xiàn)ilter寫完了,那么就修改配置文件web.xml吧,如下:
Uploadfilter yin.filter.Uploadfilter Uploadfilter /*
以上只是文件上傳的Filter,那么該怎樣使用了。放心,在下會(huì)說滴:
我們現(xiàn)在先寫一個(gè)簡單的上傳的jsp文件,
由于樣式什么的沒有調(diào)整,難看點(diǎn)也是無所謂的吧!
然后在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); }
大家有沒有發(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(); } } }
接下來,大家看看配置:
filename /imgs
看到這,不知道大家有沒有一個(gè)疑問,如果表單中的上傳文件有多個(gè),那么怎么辦?如果這樣就需要修改
FileWriterWrapper
類了,可以將獲取上下文配置中的路徑放在Servlet中,這樣就可以了,具體操作在下就不書寫了。。
以上內(nèi)容如有錯(cuò)誤,歡迎指出。。。
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。