package file;
import java.io.*;
import java.net.URLDecoder;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
public class FileUploaderUtils {
public static boolean supported(HttpServletRequest request) {
String originalFilename = request.getHeader("content-disposition");
if (originalFilename != null) return true;
return ServletFileUpload.isMultipartContent(request);
}
public static HttpServletRequest asRequest(HttpServletRequest request, File uploadSavePath) {
try {
String originalFilename = request.getHeader("content-disposition");
if (originalFilename != null) {
return asHtml5Request(request, uploadSavePath);
} else if (ServletFileUpload.isMultipartContent(request)) {
return asMultipartRequest(request, uploadSavePath);
}
return request;
} catch (RuntimeException e) {
throw e;
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
// multipart/form-data
private static FileUploaderRequest asMultipartRequest(HttpServletRequest request, File uploadSavePath) throws Throwable {
FileUploaderRequest req = new FileUploaderRequest(request);
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator it = upload.getItemIterator(request);
while (it.hasNext()) {
FileItemStream item = it.next();
String fieldName = item.getFieldName();
InputStream stream = item.openStream();
if (item.isFormField()) {
req.setParameter(fieldName, Streams.asString(stream));
} else {
String originalFilename = item.getName();
File diskFile = new File(uploadSavePath, RandomStringUtils.randomAlphanumeric(16));
OutputStream fos = new FileOutputStream(diskFile);
IOUtils.copy(stream, fos);
IOUtils.closeQuietly(fos);
FileItem fileItem = new FileItem(fieldName, originalFilename, diskFile);
req.setFile(fileItem.getFieldName(), fileItem);
}
IOUtils.closeQuietly(stream);
}
return req;
}
// application/octet-stream
private static FileUploaderRequest asHtml5Request(HttpServletRequest request, File uploadSavePath) throws Throwable {
String originalFilename = request.getHeader("content-disposition");
if (originalFilename == null) {
throw new ServletException("The request is not a html 5 file upload request.");
}
originalFilename = new String(originalFilename.getBytes("iso8859-1"), request.getCharacterEncoding());
originalFilename = StringUtils.substringAfter(originalFilename, "; filename=");
originalFilename = StringUtils.remove(originalFilename, "\"");
originalFilename = URLDecoder.decode(originalFilename, "utf-8");
File diskFile = new File(uploadSavePath, RandomStringUtils.randomAlphanumeric(16));
InputStream fis = request.getInputStream();
OutputStream fos = new FileOutputStream(diskFile);
IOUtils.copy(fis, fos);
IOUtils.closeQuietly(fis);
IOUtils.closeQuietly(fos);
FileUploaderRequest req = new FileUploaderRequest(request);
FileItem fileItem = new FileItem("unknown", originalFilename, diskFile);
req.setFile(fileItem.getFieldName(), fileItem);
return req;
}
}
package file;
import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
*
This class functions as a wrapper around HttpServletRequest to provide
* working getParameter methods for multipart requests.
* @see org.apache.struts.upload.MultipartRequestWrapper
*/
public class FileUploaderRequest extends HttpServletRequestWrapper {
private Map parameters = new HashMap();
private Map files = new HashMap();
public FileUploaderRequest(HttpServletRequest request) {
super(request);
}
/**
*
Sets a parameter for this request. The parameter is actually
* separate from the request parameters, but calling on the getParameter()
* methods of this class will work as if they weren't.
*/
public void setParameter(String name, String value) {
String[] values = (String[]) parameters.get(name);
if (values == null) {
values = new String[] { value };
parameters.put(name, values);
} else {
String[] newValues = new String[values.length + 1];
System.arraycopy(values, 0, newValues, 0, values.length);
newValues[values.length] = value;
parameters.put(name, newValues);
}
}
/**
*
Attempts to get a parameter for this request. It first looks in
* the underlying HttpServletRequest object for the parameter, and if that
* doesn't exist it looks for the parameters retrieved from the multipart
* request
*/
@Override
public String getParameter(String name) {
String value = getRequest().getParameter(name);
if (value == null) {
String[] values = (String[]) parameters.get(name);
if ((values != null) && (values.length > 0)) {
value = values[0];
}
}
return value;
}
/**
*
Returns the names of the parameters for this request. The
* enumeration consists of the normal request parameter names plus the
* parameters read from the multipart request
*/
@Override
public Enumeration getParameterNames() {
Enumeration baseParams = getRequest().getParameterNames();
List list = new ArrayList();
while (baseParams.hasMoreElements()) {
list.add(baseParams.nextElement());
}
Collection multipartParams = parameters.keySet();
Iterator iterator = multipartParams.iterator();
while (iterator.hasNext()) {
list.add(iterator.next());
}
return Collections.enumeration(list);
}
/**
*
Returns the values of a parameter in this request. It first looks
* in the underlying HttpServletRequest object for the parameter, and if
* that doesn't exist it looks for the parameter retrieved from the
* multipart request.
*/
@Override
public String[] getParameterValues(String name) {
String[] values = getRequest().getParameterValues(name);
if (values == null) {
values = (String[]) parameters.get(name);
}
return values;
}
/**
*
Combines the parameters stored here with those in the underlying
* request. If paramater values in the underlying request take precedence
* over those stored here.
*/
@Override
public Map getParameterMap() {
Map map = new HashMap(parameters);
map.putAll(getRequest().getParameterMap());
return map;
}
public void setFile(String name, FileItem file) {
files.put(name, file);
}
public FileItem getFile(String name) {
return files.get(name);
}
public Map getFiles() {
return files;
}
}
package file;
import java.io.*;
import org.apache.commons.io.*;
public class FileItem {
protected final String fieldName;
protected final String originalFileName;
protected final String originalFileExt;
protected final File diskFile;
protected final long size;
public FileItem(String fieldName, String originalFileName, File diskFile) {
this.fieldName = fieldName;
this.originalFileName = originalFileName;
this.originalFileExt = FilenameUtils.getExtension(originalFileName);
this.diskFile = diskFile;
this.size = diskFile.length();
}
public String getFieldName() {
return fieldName;
}
public String getOriginalFileName() {
return originalFileName;
}
public String getOriginalFileExt() {
return originalFileExt;
}
public File getDiskFile() {
return diskFile;
}
public long getSize() {
return size;
}
public void delete() {
if (diskFile.exists()) {
diskFile.delete();
}
}
public void moveTo(File destFile) {
try {
FileUtils.moveFile(diskFile, destFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void write(File destFile) {
try {
FileUtils.copyFile(diskFile, destFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public void write(OutputStream os) {
try {
IOUtils.copy(new FileInputStream(diskFile), os);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public InputStream asInputStream() {
try {
return new FileInputStream(diskFile);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
public String asString(String charset) {
try {
return FileUtils.readFileToString(diskFile, charset);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
<?xml version="1.0" encoding="utf-8" ?>
type="ID"
nullable="true"
display_name="ParentID"
/>
type="varchar(50)"
nullable="true"
display_name="文件分类"
/>
type="varchar(250)"
display_name="存储文件名"
/>
type="varchar(250)"
display_name="原始文件名"
/>
type="varchar(250)"
display_name="显示文件名"
/>
type="varchar(10)"
display_name="文件扩展名"
/>
type="int"
display_name="文件大小"
/>
type="ID"
display_name="上传用户姓名"
/>
type="datetime"
display_name="上传时间"
/>