jFinal + Apache Commons FileUpload 實現上傳
jFinal + Apache Commons FileUpload 實現上傳
</div>
該代碼基于JFinal源碼
/** * Copyright (c) 2011-2013, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jfinal.upload; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.naming.SizeLimitExceededException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import org.apache.commons.fileupload.FileItemIterator; import org.apache.commons.fileupload.FileItemStream; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.fileupload.util.Streams; import com.halo.util.IOUtil; import com.halo.validator.MobileValidator; /** * MultipartRequest. */ @SuppressWarnings({ "rawtypes", "unchecked" }) public class MultipartRequest extends HttpServletRequestWrapper { private static String saveDirectory; private static int maxPostSize; private static String encoding; private List<UploadFile> uploadFiles; private ServletFileUpload upload; private Map<String, String> params = new HashMap<String, String>(); private boolean sizeLimitExceeded; static void init(String saveDirectory, int maxPostSize, String encoding) { MultipartRequest.saveDirectory = saveDirectory; MultipartRequest.maxPostSize = maxPostSize; MultipartRequest.encoding = encoding; } public MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding) { super(request); wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding); } public MultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize) { super(request); wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding); } public MultipartRequest(HttpServletRequest request, String saveDirectory) { super(request); wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding); } public MultipartRequest(HttpServletRequest request) { super(request); wrapMultipartRequest(request, saveDirectory, maxPostSize, encoding); } /** * 添加對相對路徑的支持 1: 以 "/" 開頭或者以 "x:開頭的目錄被認為是絕對路徑 2: 其它路徑被認為是相對路徑, 需要 * JFinalConfig.uploadedFileSaveDirectory 結合 */ private String handleSaveDirectory(String saveDirectory) { if (saveDirectory.startsWith("/") || saveDirectory.indexOf(":") == 1) return saveDirectory; else return MultipartRequest.saveDirectory + saveDirectory; } private void wrapMultipartRequest(HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding) { saveDirectory = handleSaveDirectory(saveDirectory); File dir = new File(saveDirectory); if (!dir.exists()) if (!dir.mkdirs()) throw new RuntimeException("Directory " + saveDirectory + " not exists and can not create directory."); if (params == null) params = new HashMap<String, String>(); DiskFileItemFactory factory = new DiskFileItemFactory(); upload = new ServletFileUpload(factory); uploadFiles = new ArrayList<UploadFile>(); FileItemIterator iter; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { iter = upload.getItemIterator(request); while (iter.hasNext()) { FileItemStream item = iter.next(); String paramName = item.getFieldName(); InputStream stream = item.openStream(); if (item.isFormField()) { String value = Streams.asString(stream); params.put(paramName, value); } else { String originalfileName = item.getName(); String uploadedFileName = System.currentTimeMillis() + originalfileName; String contentType = item.getContentType(); String filePath = saveDirectory + uploadedFileName; File file = new File(filePath); bis = new BufferedInputStream(stream); bos = new BufferedOutputStream(new FileOutputStream(file)); copy(bis, bos); UploadFile uploadFile = new UploadFile(paramName, saveDirectory, uploadedFileName, originalfileName, contentType); if (isSafeFile(uploadFile)) uploadFiles.add(uploadFile); } } } catch (FileUploadException | IOException e) { e.printStackTrace(); } catch (SizeLimitExceededException e) { this.sizeLimitExceeded = true; } finally { IOUtil.closeInputStream(bis); IOUtil.closeOutStream(bos); } } public void copy(InputStream in, OutputStream out) throws IOException, SizeLimitExceededException { int contentLength = 0; byte[] buf = new byte[8192]; int len = 0; while ((len = in.read(buf)) != -1) { out.write(buf, 0, len); contentLength += len; if (contentLength > MobileValidator.REQUEST_MAX_CONTENT_LENGHT) throw new SizeLimitExceededException(); } } public boolean isSizeLimitExceeded() { return sizeLimitExceeded; } private boolean isSafeFile(UploadFile uploadFile) { if (uploadFile.getFileName().toLowerCase().endsWith(".jsp")) { uploadFile.getFile().delete(); return false; } return true; } public List<UploadFile> getFiles() { return uploadFiles; } /** * Methods to replace HttpServletRequest methods */ public Enumeration getParameterNames() { if (params == null) return null; return new Enumeration<String>() { private Iterator<String> keySetIter = params.keySet().iterator(); @Override public String nextElement() { return keySetIter.next(); } @Override public boolean hasMoreElements() { return keySetIter.hasNext(); } }; } public String getParameter(String name) { return params.get(name); } public String[] getParameterValues(String name) { return new String[] { params.get(name) }; } public Map getParameterMap() { Map map = new HashMap(); Enumeration enumm = getParameterNames(); while (enumm.hasMoreElements()) { String name = (String) enumm.nextElement(); map.put(name, getParameterValues(name)); } return map; } }
本文由用戶 admin 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!