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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!