1、本人模仿fileupload组件,尝试通过filter,解析mutipart/form-data上传的文件。
方法是,通过解析mutipart格式提交的数据,将普通field和文件field封装到自定义的FormItem类对象中。代码如下:
FormItem.java
public class FormItem {
private String name;
private String value;
private String fileName;
private String contentType;
private File file;
......
}
ParameterHandler.java,此为处理mutipart/form-data数据的filter。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
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.WebFilter;
import javax.servlet.http.HttpServletRequest;
import org.gary.servlet.entity.FormItem;
/**
* Servlet Filter implementation class ParameterHandler
*/
@WebFilter("/*")
public class ParameterHandler implements Filter {
public ParameterHandler() {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
Map<String,List<FormItem>> parameters=new HashMap<String,List<FormItem>>();
String contentType=null;
String enctype=null;
HttpServletRequest req=(HttpServletRequest)request;
if((contentType=req.getHeader("content-type"))!=null) {
String[] contentTypeItems = contentType.split(";");
enctype=contentTypeItems[0];
if("multipart/form-data".equals(enctype)) {
String boundaryString=contentTypeItems[1];
String boundary=boundaryString.substring(boundaryString.indexOf("=")+1);
BufferedReader reader = request.getReader();
String path=null;
String content=reader.readLine();
while(!content.equals("--"+boundary+"--")) {
if(content.equals("--"+boundary)) {
content=reader.readLine();
String[] ContentDisposition = content.split("; ");
String[] nameStrings=ContentDisposition[1].split("=");
String name=nameStrings[1].substring(1, nameStrings[1].length()-1);
if(ContentDisposition.length==2) {
reader.readLine();
content=reader.readLine();
if(!"".equals(content)) {
FormItem formItem = new FormItem();
formItem.setName(name);
formItem.setValue(content);
if(parameters.containsKey(name)) {
parameters.get(name).add(formItem);
}else {
ArrayList<FormItem> formItemList = new ArrayList<FormItem>();
formItemList.add(formItem);
parameters.put(name, formItemList);
}
}
content=reader.readLine();
}else if(ContentDisposition.length==3) {
String[] fileNameStrings=ContentDisposition[2].split("=");
String fileName=fileNameStrings[1].substring(1, fileNameStrings[1].length()-1);
String fileContentType=reader.readLine().split(": ")[1];
if("".equals(fileName)) {
reader.readLine();
content=reader.readLine();
}else {
if(path==null) {
String ppsPath = this.getClass().getClassLoader().getResource("").getPath();
Properties pps=new Properties();
pps.load(new FileInputStream(ppsPath+"application.properties"));
String uploadFileTempDir = pps.getProperty("uploadFileTempDir");
path=request.getServletContext().getRealPath("/")+"/WEB-INF/"+uploadFileTempDir+"/";
}
File file = new File(path+fileName);
FileWriter fw=new FileWriter(file);
reader.readLine();
String lastContent=null;
int i=0;
while((content=reader.readLine())!=null && !("--"+boundary).equals(content) && !("--"+boundary+"--").equals(content)) {
if(lastContent!=null) {
fw.write(lastContent+"\r\n");
}
lastContent=content;
}
fw.write(lastContent);
fw.close();
FormItem formItem = new FormItem();
formItem.setName(name);
formItem.setFileName(fileName);
formItem.setFile(file);
formItem.setContentType(fileContentType);
System.out.println(formItem);
if(parameters.containsKey(name)) {
parameters.get(name).add(formItem);
}else {
ArrayList<FormItem> formItemList = new ArrayList<FormItem>();
formItemList.add(formItem);
parameters.put(name, formItemList);
}
}
}
}else {
content=reader.readLine();
}
}
}
request.setAttribute("parameters", parameters);
}
//System.out.println(parameters);
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
}
}
2、上传settings.xml(文本文件),正常。但是上传例如zip等文件,发现上传的文件比原文件大,文件已损坏,无法使用。
3、问题可能出在哪里?是不是我接收用BufferedReader的readLine方法,写文件用的FileWriter,为了换行,在内容后面增加了"\r\n"的原因。应该怎么做?请大神指导。