本教程原始碼請訪問:tutorial_demo
一、檔案上傳的前提
form表單的enctype取值必須是:multipart/form-data(默認值:application/x-www-form-urlencode);
method取值必須是post;
提供一個文本選擇域<input type="file" />,
接下來的案例我們借助commons-fileupload組件實作檔案上傳,需要匯入該組件相應的支撐jar包:commons-fileupload和commons-io,我們在pom.xml中添加如下的坐標
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
二、檔案上傳回顧
2.1、撰寫上傳檔案的JSP頁面
<%-- 檔案上傳 --%>
<form action="${pageContext.request.contextPath}/fileUpload" method="post" enctype="multipart/form-data">
檔案<input type="file" name="upload" /><br/>
<button type="submit">上傳</button>
</form>
2.2、撰寫控制器類
package org.codeaction.controller;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.util.List;
import java.util.UUID;
@Controller
public class FileUploadController {
//使用fileupload組件完成檔案上傳
@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) {
//進行判斷,當前item物件是否是上傳檔案項
if (!item.isFormField()) {
//說明上傳檔案項
//獲取上傳檔案的名稱
String fileName = item.getName();
//把檔案的名稱設定唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
fileName = uuid + "_" + fileName;
//完成檔案上傳
item.write(new File(path + "\\", fileName));
//洗掉臨時檔案
item.delete();
}
}
return "success";
}
}
三、SpringMVC實作檔案上傳
3.1、組態檔決議器
在springmvc.xml中添加下面的配置
<!--組態檔決議器物件-->
<bean id="multipartResolver" >
<property name="maxUploadSize" value="https://www.cnblogs.com/codeaction/p/10485760" />
</bean>
3.2、撰寫上傳檔案的JSP頁面
<%-- SpringMVC檔案上傳 --%>
<p>SpringMVC方式檔案上傳</p>
<form action="${pageContext.request.contextPath}/fileUpload1" method="post" enctype="multipart/form-data">
檔案<input type="file" name="upload" /><br/>
<button type="submit">上傳</button>
</form>
3.3、撰寫控制器類
在控制器類中添加如下的方法
//SpringMVC實作檔案上傳
@RequestMapping("/fileUpload1")
public String fileUpload1(HttpServletRequest request, MultipartFile upload) throws IOException {
System.out.println("springmvc檔案上傳...");
//上傳的位置
String path = request.getSession().getServletContext().getRealPath("/uploads/");
//判斷,該路徑是否存在
File file = new File(path);
if(!file.exists()){
//創建該檔案夾
file.mkdirs();
}
//說明上傳檔案項
//獲取上傳檔案的名稱
String filename = upload.getOriginalFilename();
//把檔案的名稱設定唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
//完成檔案上傳
upload.transferTo(new File(path + "\\", filename));
return "success";
}
四、SpringMVC跨服務器檔案上傳
在實際開發中,我們會有很多處理不同功能的服務器,例如:
- 應用服務器,負責部署我們的應用;
- 資料庫服務器,運行我們的資料庫;
- 快取和訊息服務器,負責處理大并發訪問的快取和訊息;
- 檔案服務器,負責存盤用戶上傳檔案的服務器,
分服務器處理讓服務器各司其職,提升專案的運行效率,
4.1、創建一個圖片服務器
- 使用Maven創建一個新的web工程,不需要寫任何代碼;
- 部署該web工程時,需要修改埠號,不要和上傳檔案工程的埠號重復,HTTP port:9090,JMX port:1090,
4.2、撰寫跨服務器檔案上傳代碼
4.2.1、在pom.xml中添加坐標
<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>
這兩個Jar包用來實作檔案的上傳操作,
4.2.2、修改Tomcat配置
修改Tomcat服務器conf下的web.xml,進行如下修改
<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>listings</param-name>
<param-value>false</param-value>
</init-param>
<!-- 接受檔案的目標服務器可以支持寫入操作 -->
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
4.2.3、撰寫控制器類
在控制器類中添加如下的方法
@RequestMapping("/fileUpload2")
public String fileUpload2(MultipartFile upload) throws Exception {
System.out.println("跨服務器檔案上傳...");
// 定義上傳檔案服務器路徑
String path = "http://localhost:9090/fileuploadserver/uploads/";
// 說明上傳檔案項
// 獲取上傳檔案的名稱
String filename = upload.getOriginalFilename();
// 把檔案的名稱設定唯一值,uuid
String uuid = UUID.randomUUID().toString().replace("-", "");
filename = uuid+"_"+filename;
// 創建客戶端的物件
Client client = Client.create();
// 和圖片服務器進行連接
WebResource webResource = client.resource(path + filename);
// 上傳檔案
webResource.put(upload.getBytes());
return "success";
}
4.2.4、撰寫上傳檔案的JSP頁面
<%-- 跨服務器檔案上傳 --%>
<p>跨服務器方式檔案上傳</p>
<form action="${pageContext.request.contextPath}/fileUpload2" method="post" enctype="multipart/form-data">
檔案<input type="file" name="upload" /><br/>
<button type="submit">上傳</button>
</form>
4.2.5、啟動專案測驗
啟動圖片服務器之后,一定要在圖片服務器發布的目錄下新建uploads目錄,不然沒辦法上傳,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/160069.html
標籤:Java
下一篇:SpringMVC04_例外處理
