文件上傳的必要前提:
1.form表單的enctype取值必須是:multipart/form-data(默認值是:application/x-www-form-urlencoded)
enctype:是表單請求正文的類型
2.method屬性取值必須是Post
3.提供一個文件選擇域
藉助第三方組件實現:
需要導入的jar包:
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
主要的jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>傳統方式文件上傳</h3>
<form action="user/fileUpload" method="post" enctype="multipart/form-data">
選擇文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上傳"/>
</form>
<h3>springmvc方式文件上傳</h3>
<form action="user/fileUpload2" method="post" enctype="multipart/form-data">
選擇文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上傳"/>
</form>
<h3>跨服務器方式文件上傳</h3>
<form action="user/fileUpload3" method="post" enctype="multipart/form-data">
選擇文件:<input type="file" name="upload"/><br/>
<input type="submit" value="上傳"/>
</form>
</body>
</html>
一、傳統文件上傳方式
1.導入文件上傳的jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
2.編寫控制器方法
@RequestMapping("/fileUpload")
public String fileUpload(HttpServletRequest request) throws Exception {
System.out.println("文件上傳");
//上傳的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
//判斷是否存在
File file = new File(path);
if (!file.exists()){
//創建該文件夾
file.mkdirs();
}
//解析request對象,並獲取上傳文件項
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//解析request
List<FileItem> items = upload.parseRequest(request);
for (FileItem item : items) {
if (item.isFormField()){
//普通表單項
}else {
//上傳文件項
//獲取文件名
String name = item.getName();
//把文件名設置爲唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
name = uuid+"_"+name;
//完成文件上傳
item.write(new File(path,name));
//刪除臨時文件
item.delete();
}
}
return "success";
}
}
二、Springmvc方式文件上傳
Springmvc框架提供了MultipartFile對象,該對象表示上傳的文件,要求變量名稱必須和表單file標籤的nam屬性名稱相同
1.springmvc.xml中配置文件解析器
<!--配置文件解析器-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
2.編寫控制器方法
@RequestMapping("/fileUpload2")
public String fileUpload2(HttpServletRequest request, MultipartFile upload) throws Exception {
System.out.println("springmvc文件上傳");
//上傳的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
//判斷是否存在
File file = new File(path);
if (!file.exists()){
//創建該文件夾
file.mkdirs();
}
//上傳文件項
//獲取文件名
String name = upload.getOriginalFilename();
//把文件名設置爲唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
name = uuid+"_"+name;
//完成文件上傳
upload.transferTo(new File(path,name));
return "success";
}
三、SpringMVC跨服務器方式文件上傳
1.搭建兩個tomcat服務器
2.導入需要的jar包
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.18.1</version>
</dependency>
3.編寫控制器方法
@RequestMapping("/fileUpload3")
public String fileUpload3(MultipartFile upload) throws Exception {
System.out.println("跨服務器文件上傳");
//定義上傳文件服務器路徑
String path = "http://localhost:9090/uploads/";
//上傳文件項
//獲取文件名
String name = upload.getOriginalFilename();
//把文件名設置爲唯一值,uuid
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
name = uuid+"_"+name;
//創建客戶端對象
Client client = Client.create();
//和服務器連接
WebResource webResource = client.resource(path+name);
//文件上傳
webResource.put(upload.getBytes());
return "success";
}