1.
@RequestMapping("/doSaveBill.htm")
public void uploadFile(Integer loginId,HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {
int num = 0;
// 设置request编码,主要是为了处理普通输入框中的中文问题
request.setCharacterEncoding("UTF-8");
System.out.println("解析工作马上开始.......................");
// 这里对request进行封装,RequestContext提供了对request多个访问方法
org.apache.commons.fileupload.RequestContext requestContext = new ServletRequestContext(request);
// 判断表单是否是Multipart类型的。这里可以直接对request进行判断,不过已经以前的用法了
if (FileUpload.isMultipartContent(requestContext)) {
num++;
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置文件的缓存路径
factory.setRepository(new File("D:/tmp"));
File dir = new File("d:\\download");
if (!dir.exists()) {
dir.mkdirs();
}
// System.out.print("已经生成临时文件");
try {
response.getWriter().write("200");
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置上传文件大小的上限,-1表示无上限
upload.setSizeMax(100000 * 1024 * 1024);
List items = new ArrayList();
try {
// 上传文件,并解析出所有的表单字段,包括普通字段和文件字段
items = upload.parseRequest(request);
} catch (FileUploadException e1) {
System.out.println("文件上传发生错误" + e1.getMessage());
}
// 下面对每个字段进行处理,分普通字段和文件字段
Iterator it = items.iterator();
while (it.hasNext()) {
DiskFileItem fileItem = (DiskFileItem) it.next();
// 如果是普通字段
if (fileItem.isFormField()) {
// System.out.println(fileItem.getFieldName()
// + " "
// + fileItem.getName()
// + " "
// + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
} else {
System.out.println(fileItem.getFieldName() + " "
+ fileItem.getName() + " "
+ fileItem.isInMemory() + " "
+ fileItem.getContentType() + " "
+ fileItem.getSize());
// 保存文件,其实就是把缓存里的数据写到目标路径下
if (fileItem.getName() != null && fileItem.getSize() != 0) {
File fullFile = new File(fileItem.getName());
File newFile = new File("d:/download/"+num //拼上num,防止文件名重复
+ fullFile.getName());
try {
fileItem.write(newFile);
// 设置响应码
response.setStatus(200);
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("文件没有选择 或 文件内容为空");
}
}
}
//上传完毕后手动删除缓存的 文件
File file = new File("D:/tmp");
if (file.exists()) {
File[] listFiles = file.listFiles();
for (File deleteFile : listFiles) {
deleteFile.delete();
}
}
}
}
2.使用spring文件解析器
@RequestMapping("/doSaveBill2.htm")
public void upload(Integer loginId,HttpServletRequest req,HttpServletResponse resp){
Map<String,String> result = new HashMap<String, String>();
File localFile = null;
//创建通用的多部分解析器
CommonsMultipartResolver cmr = new CommonsMultipartResolver(req.getSession().getServletContext());
//判断是否有文件在request中,即多部分请求
if(cmr.isMultipart(req)){
//转换成多部分request
MultipartHttpServletRequest msr = (MultipartHttpServletRequest)req;
//取得request中所有的文件名
Iterator<String> iter = msr.getFileNames();
while(iter.hasNext()){
//记录上传过程起始时的时间,用来计算上传时间
long pre = System.currentTimeMillis();
//取得上传的文件
MultipartFile file = msr.getFile(iter.next());
if(file != null){
//取得当前上传文件的文件名
String fileName = file.getOriginalFilename();
//如果文件名不为"",说明该文件存在,否则说明该文件不存在
if(!"".equals(fileName.trim())){
//重命名上传后的文件名
String newFileName = ""+System.currentTimeMillis()+fileName;
//定义上传路径
String path = "D:/download" + newFileName;
localFile = new File(path);
try {
file.transferTo(localFile);
} catch (Exception e) {
LOGGER.error("文件上传出错");
}
}else{
result.put("code", "2");
result.put("msg", "文件不存在!");
}
}
}
}
if(!"2".equals(result.get("code"))){//成功返回200
result.put("code", "200");
result.put("msg", "文件上传成功");
}
}
<!-- 配置文件解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8"></property>
<!-- 文件上传最大值 10M 1024*1024*10=10485760 -->
<property name="maxUploadSize" value="10485760"></property>
<!-- 存在文件的最大值,40K,超过就存在硬盘 -->
<property name="maxInMemorySize" value="40960"></property>
</bean>