SpringMVC實(shí)現(xiàn)文件上傳
文件的上傳與下載基本上是web項(xiàng)目中會(huì)用到的技術(shù),在web學(xué)習(xí)中我們用到的是 Apache fileupload這個(gè)組件來(lái)實(shí)現(xiàn)上傳,在springmvc中對(duì)它進(jìn)行了封裝,讓我們使用起來(lái)比較方便,但是底層還是由Apache fileupload來(lái)實(shí)現(xiàn)的。springmvc中由MultipartFile接口來(lái)實(shí)現(xiàn)文件上傳。
- 首先在配置文件.xml下配置相關(guān)的配置,例如在SpringMVC上下文中配置MultipartResolver。例如:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="10000000"/>
</bean>
在這里還可配置相關(guān)的上傳文件的大小編碼格式等
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--上傳文件的最大大小,單位為字節(jié) -->
<property name="maxUploadSize" value="17367648787"></property>
<!-- 上傳文件的編碼 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
-
引入springsource.org.apache.commons.fileupload和springsource.org.apache.commons.io兩個(gè)jar包
image.png
如果你是用maven進(jìn)行版本依賴管理的話,就在pom.xml
相關(guān)文件配置下
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
3.在前端頁(yè)面中,必須在提交表單的method設(shè)置post,并將enctype設(shè)置multipart/form-data.只有這樣的情況下,瀏覽器才會(huì)把用戶選擇的文件以二進(jìn)制數(shù)據(jù)發(fā)送給服務(wù)器
4.SpringMVC會(huì)將上傳的文件綁定到MultipartFile對(duì)象中。MultipartFile提供了獲取上傳文件的內(nèi)容,文件名等方法。通transferTo()方法還可以將文件存儲(chǔ)到硬件中。
MultipartFile對(duì)象中的常用方法如下:
# void transferTo(File dest):將上傳文件保存到一個(gè)目錄文件中;
# String getOriginalFilename():獲取上傳文件的原名
# String getContentType[]:獲取文件MIME類型,如image/jpeg等
# boolean isEmpty():是否有上傳文件
5.在控制層中接收,使用MultipartFile對(duì)象作為參數(shù),接收前端發(fā)送過(guò)來(lái)的文件,將文件寫入本地文件中,就完成上傳操作
```java
@RequestMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest req)
throws IllegalStateException, IOException {
// 判斷文件是否為空,空則返回失敗頁(yè)面
if (file.isEmpty()) {
return "failed";
}
// 獲取文件存儲(chǔ)路徑(絕對(duì)路徑)
String path = req.getServletContext().getRealPath("/WEB-INF/file");
// 獲取原文件名
String fileName = file.getOriginalFilename();
// 創(chuàng)建文件實(shí)例
File filePath = new File(path, fileName);
// 如果文件目錄不存在,創(chuàng)建目錄
if (!filePath.getParentFile().exists()) {
filePath.getParentFile().mkdirs();
System.out.println("創(chuàng)建目錄" + filePath);
}
// 寫入文件
file.transferTo(filePath);
return "success";
}
擴(kuò)展(三種實(shí)現(xiàn)SpringMVC上傳文件的方式)
- 采用流的方式上傳文件
- 采用multipart提供的file.transfer方法上傳文件
- 使用spring mvc提供的類的方法上傳文件
分別把三種上傳文件寫在前臺(tái)頁(yè)面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<form name="serForm" action="/項(xiàng)目名/fileUpload" method="post" enctype="multipart/form-data">
<h1>采用流的方式上傳文件</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
<form name="Form2" action="/項(xiàng)目名/fileUpload2" method="post" enctype="multipart/form-data">
<h1>采用multipart提供的file.transfer方法上傳文件</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>`在這里插入代碼片`
<form name="Form2" action="/項(xiàng)目名/springUpload" method="post" enctype="multipart/form-data">
<h1>使用spring mvc提供的類的方法上傳文件</h1>
<input type="file" name="file">
<input type="submit" value="upload"/>
</form>
</body>
</html>
配置文件
<!-- 多部分文件上傳 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
//設(shè)置文件上傳文件大小的最大值
<property name="maxUploadSize" value="104857600" />
//設(shè)置了文件放入臨時(shí)文件夾的最小大小限制,此為閾值,低于此值,則保存在內(nèi)存中,如高于此值,則生成硬盤上的臨時(shí)文件
<property name="maxInMemorySize" value="4096" />
//設(shè)置編碼格式
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
采用流的方式上傳文件
/*
* 通過(guò)流的方式上傳文件
* @RequestParam("file") 將name=file控件得到的文件封裝成CommonsMultipartFile 對(duì)象
*/
@RequestMapping("fileUpload",,method=RequestMethod.POST)
public String fileUpload(@RequestParam("file") CommonsMultipartFile file) throws IOException {
//用來(lái)檢測(cè)程序運(yùn)行時(shí)間
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename());
try {
//獲取輸出流
OutputStream os=new FileOutputStream("E:/"+new Date().getTime()+file.getOriginalFilename());
//獲取輸入流 CommonsMultipartFile 中可以直接得到文件的流
InputStream is=file.getInputStream();
int temp;
//一個(gè)一個(gè)字節(jié)的讀取并寫入
while((temp=is.read())!=(-1))
{
os.write(temp);
}
os.flush();
os.close();
is.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("方法一的運(yùn)行時(shí)間:"+String.valueOf(endTime-startTime)+"ms");
return "/success";
}
2.采用multipart提供的file.transfer方法上傳文件
/*
* 采用file.Transto 來(lái)保存上傳的文件
*/
@RequestMapping("fileUpload2",method=RequestMethod.POST)
public String fileUpload2(@RequestParam("file") CommonsMultipartFile file) throws IOException {
long startTime=System.currentTimeMillis();
System.out.println("fileName:"+file.getOriginalFilename());
String path="E:/"+new Date().getTime()+file.getOriginalFilename();
File newFile=new File(path);
//通過(guò)CommonsMultipartFile的方法直接寫文件(注意這個(gè)時(shí)候)
file.transferTo(newFile);
long endTime=System.currentTimeMillis();
System.out.println("方法二的運(yùn)行時(shí)間:"+String.valueOf(endTime-startTime)+"ms");
return "/success";
}
3.使用spring mvc提供的類的方法上傳文件
/*
*采用spring提供的上傳文件的方法
*/
@RequestMapping("springUpload",method=RequestMethod.POST)
public String springUpload(HttpServletRequest request) throws IllegalStateException, IOException
{
long startTime=System.currentTimeMillis();
//將當(dāng)前上下文初始化給 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="E:/springUpload"+file.getOriginalFilename();
//上傳
file.transferTo(new File(path));
}
}
}
long endTime=System.currentTimeMillis();
System.out.println("方法三的運(yùn)行時(shí)間:"+String.valueOf(endTime-startTime)+"ms");
return "/success";
}
測(cè)試上傳的時(shí)間:
第一次我用一個(gè)4M的文件:
fileName:test.rar
方法一的運(yùn)行時(shí)間:14712ms
方法二的運(yùn)行時(shí)間:5ms
方法三的運(yùn)行時(shí)間:4ms
第二次:我用一個(gè)50M的文件
方式一進(jìn)度很慢,估計(jì)得要個(gè)5分鐘
方法二的運(yùn)行時(shí)間:67ms
方法三的運(yùn)行時(shí)間:80ms
由此可見(jiàn)我們比較推崇使用SpringMVC中自帶的文件上傳方法
