这里使用commons-io-2.4.jar和commons-fileupload-1.3.1.jar实现文件上传,所以事先要把这两个包加入到项目中。
文件解析类
package com.hc.web.io;
import java.util.Iterator;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
public class UploadFileParse {
public static MutipartFile parseRequest(HttpServletRequest request) throws Exception {
MutipartFile mf = new MutipartFile();
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload sfu = new ServletFileUpload(factory);
List<FileItem> items = sfu.parseRequest(new ServletRequestContext(request));
Iterator<FileItem> iter = items == null ? null : items.iterator();
while (iter != null && iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.isFormField()) {
String field = item.getFieldName().trim();
String value = item.getString("UTF-8").trim();
mf.put(field, value);
} else if (!item.isFormField()) {
mf.setFileName(item.getName());
mf.setInputStream(item.getInputStream());
}
}
return mf;
}
}
文件信息类
package com.hc.web.io;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
public class MutipartFile {
private Map<String,String> params = new HashMap<>();
private InputStream inputStream;
private String fileName;
public void put(String key,String value){
params.put(key, value);
}
public void setInputStream(InputStream inputStream) {
this.inputStream = inputStream;
}
public Map<String,String> getParams(){
return params;
}
public String getString(String key){
return params.get(key)==null?null:params.get(key);
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public void copyToFile(File file) throws IOException{
FileOutputStream fos = new FileOutputStream(file);
byte [] buffer = new byte[1024];
int len = -1;
while((len = inputStream.read(buffer)) != -1){
fos.write(buffer, 0, len);
}
fos.flush();
fos.close();
}
}
修改AbstractHcAction类
//调用controller方法
Method method = controllerClassInfo.getMethodMap().get(methodParam);
Object invoke = null;
if(ServletFileUpload.isMultipartContent(request)){
MutipartFile mf = UploadFileParse.parseRequest(request);
invoke = method.invoke(newInstance, request,response,mf);
}else{
invoke = method.invoke(newInstance, request,response);
}
if(invoke != null && invoke instanceof View){
View view = (View)invoke;
request.getRequestDispatcher(view.getPath()).forward(request, response);
}
修改UserController类
@MethodMapping(method="upload")
public View uploadFile(HttpServletRequest request, HttpServletResponse response,MutipartFile file) throws Exception{
String parameter = file.getString("file_name");
File targetFile = new File("c:/aaa.txt");
file.copyToFile(targetFile);
return new View("user.jsp");
}
测试
需要一个jsp页面,页面上使用form表单上传一个txt文件,这里这个jsp页面的代码就不列出来了。form的action路径是
/上下文/user.hc?method=upload。
启动tomcat,浏览器输入上传jsp的地址,然后选择一个txt的文件,点击提交按钮。然后查看c盘下是不是多了一个aaa.txt
的文件。