springmvc三种上传方式对比:
前端页面:
<form action="${pageContext.request.contextPath}/Upload/fileUpload1.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file">
<input type="submit" value="提交方法一">
</form>
<form action="${pageContext.request.contextPath}/Upload/fileUpload2.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file1">
<input type="submit" value="提交方法二">
</form>
<form action="${pageContext.request.contextPath}/Upload/springUpload.action" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file">
<input type="submit" value="提交方法三">
配置都是一样的:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="10485760000"></property>
<property name="maxInMemorySize" value="40960"></property>
<property name="uploadTempDir" value="fileUpload"></property>
</bean>
方法一(通过流的方式上传文件):
通过流的方式上传文件
@RequestParam(“file”) 将name=file控件得到的文件封装成CommonsMultipartFile 对象
@RequestMapping("fileUpload1")
public String fileUpload(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) throws IOException {
//用来检测程序运行时间
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename());
try {
//获取输出流
OutputStream os=new FileOutputStream(request.getSession().getServletContext().getRealPath("/") + "fileUpload/"+file.getOriginalFilename());
//获取输入流 CommonsMultipartFile 中可以直接得到文件的流
InputStream is=file.getInputStream();
int temp;
//一个一个字节的读取并写入
while((temp=is.read())!=(-1))
{
os.write(temp);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("方法一的运行时间:"+String.valueOf(endTime-startTime)+"ms");
return "/return.jsp";
}
方法二:
采用file.Transto 来保存上传的文件
@RequestMapping("fileUpload2")
public ModelAndView importExcel(@RequestParam("file1") MultipartFile file, HttpServletRequest request){
long startTime=System.currentTimeMillis();
ModelAndView modelAndView = new ModelAndView();
// 判断文件是否为空
if (!file.isEmpty()) {
// 文件保存路径
String filePath = request.getSession().getServletContext().getRealPath("/") + "fileUpload/"
+ file.getOriginalFilename();
// 转存文件
try {
file.transferTo(new File(filePath));
modelAndView.setViewName("/return.jsp");
modelAndView.addObject("result", file.getOriginalFilename()+"上传成功");
} catch (Exception e) {
modelAndView.addObject("result", file.getOriginalFilename()+"上传失败");
e.printStackTrace();
}
}
long endTime=System.currentTimeMillis();
System.out.println("方法二的运行时间:"+String.valueOf(endTime-startTime)+"ms");
return modelAndView;
}
方法三:
使用spring mvc提供的类的方法上传文件
@RequestMapping("springUpload")
public ModelAndView springUpload(HttpServletRequest request) throws IllegalStateException, IOException
{
ModelAndView modelAndView = new ModelAndView();
long startTime=System.currentTimeMillis();
//将当前上下文初始化给 CommonsMutipartResolver (多部分解析器)
CommonsMultipartResolver multipartResolver=new CommonsMultipartResolver(
request.getSession().getServletContext());
//检查form中是否有enctype="multipart/form-data"
if(multipartResolver.isMultipart(request))
{
//将request变成多部分request
MultipartHttpServletRequest multiRequest=(MultipartHttpServletRequest)request;
//获取multiRequest 中所有的文件名
Iterator iter=multiRequest.getFileNames();
while(iter.hasNext())
{
//一次遍历所有文件
MultipartFile file=multiRequest.getFile(iter.next().toString());
if(file!=null)
{
String path=request.getSession().getServletContext().getRealPath("/") + "fileUpload/"+file.getOriginalFilename();
//上传
file.transferTo(new File(path));
modelAndView.addObject("result", file.getOriginalFilename()+"上传成功");
}
}
}
long endTime=System.currentTimeMillis();
System.out.println("方法三的运行时间:"+String.valueOf(endTime-startTime)+"ms");
modelAndView.setViewName("/return.jsp");
return modelAndView;
}
第一种通过流的方式上传文件太慢,尽量使用第二或第三种方式。