👉 原文首發: 小牛肉的個人博客,歡迎來訪~
文章目錄
一、傳統方式的文件上傳
傳統方式的文件上傳,指的是我們上傳的文件和訪問的應用存在於同一臺服務器上。 並且上傳完成之後,瀏覽器可能跳轉。
1. 導入依賴
<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>
2. Jsp界面
<form action="/fileupload" method="post" enctype="multipart/form-data">
<input type="file" name = "upload"/>
<br/>
<input type="submit" value="上傳文件">
</form>
3. Controller控制器
//控制器類
@Controller
public class FileController {
@RequestMapping("/fileupload")
public String fileupload(HttpServletRequest request) throws Exception {
// 先獲取到要上傳的文件目錄
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
// 創建File對象,一會向該路徑下上傳文件
File file = new File(realPath);
// 判斷路徑是否存在,如果不存在,創建該路徑
if(!file.exists()){
file.mkdirs();
}
// 創建磁盤文件項工廠
DiskFileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
// 解析request對象
List<FileItem> list = servletFileUpload.parseRequest(request);
// 遍歷
for(FileItem fileItem : list){
// 判斷文件項是普通字段,還是上傳的文件
if(fileItem.isFormField()){
}
// 上傳文件項
else{
// 獲取到上傳文件的名稱
String filname = fileItem.getName();
// 上傳文件
fileItem.write(new File(file,filname));
// 刪除臨時文件
fileItem.delete();
}
}
return "success";
}
}
4. 運行結果
文件會上傳到 target
目錄下的 uploads 文件夾
二、 SpringMVC傳統方式的文件上傳
同樣需要導入上一步的pom依賴文件
原理如下:
1. 配置文件解析器
springmvc.xml
<!-- 配置文件上傳解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 設置上傳文件的最大尺寸爲 5MB -->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
注意: 文件上傳的解析器 id是固定的,不能起別的名稱,否則無法實現請求參數的綁定。(不光是文件,其他 字段也將無法綁定)
2. Jsp界面
<form action="/fileUpload2" method="post" enctype="multipart/form-data">
名稱:<input type="text" name="picname"/><br/>
圖片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value=" 上傳 "/>
</form>
3. Controller控制器
@RequestMapping("/fileUpload2")
// 參數picname、uploadFile要和jsp界面的name一致
public String FileUpload2(String picname, MultipartFile uploadFile, HttpServletRequest request) throws IOException {
// 1. 定義文件名
String fileName = "";
// 獲取原始文件名
String uploadFileName = uploadFile.getOriginalFilename();
// 截取文件擴展名
String extendName = uploadFileName.substring(uploadFileName.lastIndexOf(".") + 1, uploadFileName.length());
// 把文件加上隨機數,防止文件重複
String uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();
// 判斷是否輸入了文件名
if(!StringUtils.isEmpty(picname)){
fileName = uuid + "_" + picname + "." + extendName;
}
else{
fileName = uuid + "_" + uploadFileName;
}
System.out.println(fileName);
// 2. 獲取到要上傳的文件目錄
String realPath = request.getSession().getServletContext().getRealPath("/uploads");
// 3. 創建File對象,一會向該路徑下上傳文件
File file = new File(realPath);
// 判斷路徑是否存在,如果不存在,創建該路徑
if(!file.exists()){
file.mkdirs();
}
// 4. 使用 MulitpartFile 接口中方法,把上傳的文件寫到指定位置
uploadFile.transferTo(new File(file, fileName));
return "success";
}
4. 運行結果
三、SpringMVC跨服務器方式的文件上傳
此處我們用兩個 Tomcat 服務器模擬應用服務器和圖片服務器
1. 新建一個Tomcat服務器存儲圖片
新建一個 fileuploadserver web工程
在webapp 下創建uploads文件夾用來存儲圖片
同時需要在target目錄下創建uploads文件夾(這一步很重要,不做的話會報409錯誤)
Tomcat 服務器配置,注意修改端口號
還需要在web.xml中修改serlvet權限,servlet默認權限是隻讀 (這步不做會報405錯誤)
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
org.apache.catalina.servlets.DefaultServlet
會爆紅,不用理會,我們只需要能夠修改權限就可以了
OK,至此,圖片服務器 fileupload 的配置完畢,接下來開始應用服務器 springmvc 的配置和代碼編寫
2. 導入依賴
<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. Jsp界面
<form action="/fileUpload3" method="post" enctype="multipart/form-data">
圖片:<input type="file" name="uploadFile"/><br/>
<input type="submit" value=" 上傳 "/>
</form>
4. Controller控制器
@RequestMapping(value = "/fileUpload3")
// 參數picname、uploadFile要和jsp界面的name一致
public String FileUpload3(MultipartFile uploadFile) throws IOException {
System.out.println("SpringMVC跨服務器方式的文件上傳......");
//定義圖片服務器的請求路徑
String path = "http://localhost:9090/uploads/";
//獲取到上傳文件的名稱
String filename = uploadFile.getOriginalFilename();
// 把文件加上隨機數,防止文件重複
String uuid = UUID.randomUUID().toString().replace("-", "").toUpperCase();
// 文件名稱唯一化
filename = uuid + "_" + filename;
//向圖片服務器上傳文件
// 1. 創建客戶端對象
Client client = Client.create();
// 2. 連接圖片服務器
WebResource resource = client.resource(path + filename);
// 3. 上傳文件
resource.put(uploadFile.getBytes());
return "success";
}
5. 運行結果
最終圖片保存在 圖片服務器 的 target 文件夾下的 uploads 中