本教程源碼請訪問:tutorial_demo 一、文件上傳的前提 form表單的enctype取值必須是:multipart/form-data(預設值:application/x-www-form-urlencode); method取值必須是post; 提供一個文本選擇域<input type= ...
本教程源碼請訪問: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" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="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目錄,不然沒辦法上傳。