javascript
java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载
Spring MVC框架的文件上傳是基于 commons-fileupload 組件的文件上傳,只不過SpringMVC 框架在原有文件上傳組件上做了進一步封裝,簡化了文件上傳的代碼實現,取消了不同上傳組件上的編程差異。
commons-fileupload組件
由于 Spring MVC 框架的文件上傳是基于 commons-fileupload 組件的文件上傳,因此需要將 commons-fileupload 組件相關的 JAR(commons-fileupload-1.3.1.jar 和 commons-io-2.4.jar)復制到 Spring MVC 應用的 WEB-INF/lib 目錄下。下面講解如何下載相關 JAR 包。
Commons 是 Apache 開放源代碼組織中的一個Java子項目,該項目包括文件上傳、命令行處理、數據庫連接池、XML 配置文件處理等模塊。fileupload 就是其中用來處理基于表單的文件上傳的子項目,commons-fileupload 組件性能優良,并支持任意大小文件的上傳。
commons-fileupload 組件可以從“http://commons.apache.org/proper/commons-fileupload/”下載,本教程采用的版本是 1.2.2。下載它的 Binares 壓縮包(commons-fileupload-1.3.1-bin.zip),解壓縮后的目錄中有兩個子目錄,分別是 lib 和 site。
在 lib 目錄下有一個 JAR 文件——commons-fileupload-1.3.1.jar,該文件是 commons-fileupload 組件的類庫。在 site 目錄中是 commons-fileupload 組件的文檔,也包括 API 文檔。
commons-fileupload 組件依賴于 Apache 的另外一個項目——commons-io,該組件可以從“http://commons.apache.org/proper/commons-io/”下載,本教程采用的版本是 2.4。下載它的 Binaries 壓縮包(commons-io-2.4-bin.zip),解壓縮后的目錄中有 4 個 JAR 文件,其中有一個 commons-io-2.4.jar 文件,該文件是 commons-io 的類庫。
基于表單的文件上傳
標簽 會在瀏覽器中顯示一個輸入框和一個按鈕,輸入框可供用戶填寫本地文件的文件名和路徑名,按鈕可以讓瀏覽器打開一個文件選擇框供用戶選擇文件。
文件上傳的表單例子如下:
對于基于表單的文件上傳,不要忘記使用 enctype 屬性,并將它的值設置為 multipart/form-data,同時將表單的提交方式設置為 post。為什么要這樣呢?下面從 enctype 屬性說起。
表單的 enctype 屬性指定的是表單數據的編碼方式,該屬性有以下 3 個值。
application/x-www-form-urlencoded:這是默認的編碼方式,它只處理表單域里的 value 屬性值。
multipart/form-data:該編碼方式以二進制流的方式來處理表單數據,并將文件域指定文件的內容封裝到請求參數里。
text/plain:該編碼方式只有當表單的 action 屬性為“mailto:”URL 的形式時才使用,主要適用于直接通過表單發送郵件的方式。
由上面 3 個屬性的解釋可知,在基于表單上傳文件時 enctype 的屬性值應為 multipart/form-data。
MultipartFile接口
在 Spring MVC 框架中上傳文件時將文件相關信息及操作封裝到 MultipartFile 對象中,因此開發者只需要使用 MultipartFile 類型聲明模型類的一個屬性即可對被上傳文件進行操作。該接口具有如下方法。
名稱作用
byte[] getBytes()
以字節數組的形式返回文件的內容
String getContentType()
返回文件的內容類型
InputStream getInputStream()
返回一個InputStream,從中讀取文件的內容
String getName()
返回請求參數的名稱
String getOriginalFillename()
返回客戶端提交的原始文件名稱
long getSize()
返回文件的大小,單位為字節
boolean isEmpty()
判斷被上傳文件是否為空
void transferTo(File destination)
將上傳文件保存到目標目錄下
在上傳文件時需要在配置文件中使用 Spring 的 org.springframework.web.multipart.commons.CommonsMultipartResolver 類配置 MultipartResolver 用于文件上傳。
Spring MVC單文件上傳
1)創建應用并導入 JAR 包
創建應用 springMVCDemo11,將SpringMVC 相關的 JAR 包、commons-fileupload 組件相關的 JAR 包以及 JSTL相關的 JAR 包導入應用的 lib 目錄中,如圖 1 所示。
圖 1??springMVCDemo11
2)創建 web.xml 文件
在 WEB-INF 目錄下創建 web.xml 文件。為防止中文亂碼,需要在 web.xml 文件中添加字符編碼過濾器,這里不再贅述。
3)創建文件選擇頁面
在 WebContent 目錄下創建JSP頁面 oneFile.jsp,在該頁面中使用表單上傳單個文件,具體代碼如下:
Insert title here選擇文件:文件描述:
4)創建 POJO 類
在 src 目錄下創建 pojo 包,在該包中創建 POJO 類 FileDomain。然后在該 POJO 類中聲明一個 MultipartFile 類型的屬性封裝被上傳的文件信息,屬性名與文件選擇頁面 oneFile.jsp 中的 file 類型的表單參數名 myfile 相同。具體代碼如下:
package pojo;
import org.springframework.web.multipart.MultipartFile;public classFileDomain {privateString description;privateMultipartFile myfile;publicString getDescription() {returndescription;
}public voidsetDescription(String description) {this.description =description;
}publicMultipartFile getMyfile() {returnmyfile;
}public voidsetMyfile(MultipartFile myfile) {this.myfile =myfile;
}
}
5)創建控制器類
在 src 目錄下創建 controller 包,并在該包中創建 FileUploadController 控制器類。具體代碼如下:
package controller;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.FileDomain;
@Controllerpublic classFileUploadController {//得到一個用來記錄日志的對象,這樣在打印信息時能夠標記打印的是哪個類的信息
private static final Log logger = LogFactory.getLog(FileUploadController.class);/**
* 單文件上傳*/@RequestMapping("/onefile")publicString oneFileUpload(@ModelAttribute FileDomain fileDomain,
HttpServletRequest request) {/** 文件上傳到服務器的位置“/uploadfiles”,該位置是指
* workspace\.metadata\.plugins\org.eclipse
* .wst.server.core\tmp0\wtpwebapps, 發布后使用*/String realpath=request.getServletContext()
.getRealPath("uploadfiles");
String fileName=fileDomain.getMyfile().getOriginalFilename();
File targetFile= newFile(realpath, fileName);if (!targetFile.exists()) {
targetFile.mkdirs();
}//上傳
try{
fileDomain.getMyfile().transferTo(targetFile);
logger.info("成功");
}catch(Exception e) {
e.printStackTrace();
}return "showOne";
}
}
6)創建 Spring MVC 的配置文件
在上傳文件時需要在配置文件中使用 Spring 的 CommonsMultipartResolver 類配置 MultipartResolver 用于文件上傳,應用的配置文件 springmvc-servlet.xml 的代碼如下:
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
7)創建成功顯示頁面
在 WEB-INF 目錄下創建 JSP 文件夾,并在該文件夾中創建單文件上傳成功顯示頁面 showOne.jsp。具體代碼如下:
Insert title here${fileDomain.myfile.originalFilename }
8)測試文件上傳
發布 springMVCDemo11 應用到 Tomcat 服務器并啟動 Tomcat 服務器,然后通過地址“http://localhost:8080/springMVCDemo11/oneFile.jsp”運行文件選擇頁面,運行結果如圖 2 所示。
圖 2??單文件選擇頁面
在圖 2 中選擇文件并輸入文件描述,然后單擊“提交”按鈕上傳文件,若成功則顯示如圖 3 所示的結果。
圖 3??單文件成功上傳結果
Spring MVC多文件上傳
1)創建多文件選擇頁面
在 WebContent 目錄下創建JSP頁面 multiFiles.jsp,在該頁面中使用表單上傳多個文件,具體代碼如下:
Insert title here選擇文件1:文件描述1:
選擇文件2:
文件描述2:
選擇文件3:
文件描述3:
2)創建 POJO 類
在上傳多文件時需要 POJO 類 MultiFileDomain 封裝文件信息,MultiFileDomain 類的具體代碼如下:
package pojo;
import java.util.List;
import org.springframework.web.multipart.MultipartFile;public classMultiFileDomain {private Listdescription;private ListmyFile;//省略setter和getter方法
}
3)添加多文件上傳處理方法
在控制器類 FileUploadController 中添加多文件上傳的處理方法 multiFileUpload,具體代碼如下:
/**
* 多文件上傳*/@RequestMapping("/multifile")publicString multiFileUpload(@ModelAttribute MultiFileDomain multiFileDomain,HttpServletRequest request) {
String realpath= request.getServletContext().getRealPath("uploadfiles");
File targetDir= newFile(realpath);if (!targetDir.exists()) {
targetDir.mkdirs();
}
List files =multiFileDomain.getMyFile();for (int i = 0; i < files.size(); i++) {
MultipartFile file= files.get(i);
String fileName=file.getOriginalFilename();
File targetFile= newFile(realpath, fileName);//上傳
try{
file.transferTo(targetFile);
}catch(Exception e) {
e.printStackTrace();
}
}
logger.info("成功");return "showMulti";
}
4)創建成功顯示頁面
在 JSP 文件夾中創建多文件上傳成功顯示頁面 showMulti.jsp,具體代碼如下:
Insert title here| 詳情 | 文件名 |
| ${description} | ${multiFileDomain.myfile[loop.count-1].originalFilename} |
5)測試文件上傳
發布 springMVCDemo11 應用到 Tomcat 服務器并啟動 Tomcat 服務器,然后通過地址“http://localhost:8080/springMVCDemo11/multiFiles.jsp”運行多文件選擇頁面,運行結果如圖 1 所示。
圖 1??多文件選擇頁面
在圖 1 中選擇文件并輸入文件描述,然后單擊“提交”按鈕上傳多個文件,若成功則顯示如圖 2 所示的結果。
圖 2??多文件成功上傳結果
Spring MVC文件下載
文件下載的實現方法
實現文件下載有以下兩種方法:
通過超鏈接實現下載。
利用程序編碼實現下載。
通過超鏈接實現下載固然簡單,但暴露了下載文件的真實位置,并且只能下載存放在 Web 應用程序所在的目錄下的文件。
利用程序編碼實現下載可以增加安全訪問控制,還可以從任意位置提供下載的數據,可以將文件存放到 Web 應用程序以外的目錄中,也可以將文件保存到數據庫中。
利用程序實現下載需要設置兩個報頭:
1)Web 服務器需要告訴瀏覽器其所輸出內容的類型不是普通文本文件或 HTML 文件,而是一個要保存到本地的下載文件,這需要設置 Content-Type 的值為 application/x-msdownload。
2)Web 服務器希望瀏覽器不直接處理相應的實體內容,而是由用戶選擇將相應的實體內容保存到一個文件中,這需要設置 Content-Disposition 報頭。
該報頭指定了接收程序處理數據內容的方式,在 HTTP 應用中只有 attachment 是標準方式,attachment 表示要求用戶干預。在 attachment 后面還可以指定 filename 參數,該參數是服務器建議瀏覽器將實體內容保存到文件中的文件名稱。
設置報頭的示例如下:
response.setHeader("Content-Type", "application/x-msdownload");
response.setHeader("Content-Disposition", "attachment;filename="+filename);
文件下載的過程
下面繼續通過 springMVCDemo11 應用講述利用程序實現下載的過程,要求從《Spring MVC單文件上傳》上傳文件的目錄(workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\springMVCDemo11\uploadfiles)中下載文件,具體開發步驟如下:
1)編寫控制器類
首先編寫控制器類 FileDownController,在該類中有 3 個方法,即 show、down 和 toUTF8String。其中,show 方法獲取被下載的文件名稱;down 方法執行下載功能;toUTF8String 方法是下載保存時中文文件名的字符編碼轉換方法。
FileDownController 類的代碼如下:
package controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controllerpublic classFileDownController {//得到一個用來記錄日志的對象,在打印時標記打印的是哪個類的信息
private static final Log logger =LogFactory
.getLog(FileDownController.class);/**
* 顯示要下載的文件*/@RequestMapping("showDownFiles")publicString show(HttpServletRequest request, Model model) {//從 workspace\.metadata\.plugins\org.eclipse.wst.server.core\//tmp0\wtpwebapps\springMVCDemo11\下載
String realpath =request.getServletContext()
.getRealPath("uploadfiles");
File dir= newFile(realpath);
File files[]=dir.listFiles();//獲取該目錄下的所有文件名
ArrayList fileName = new ArrayList();for (int i = 0; i < files.length; i++) {
fileName.add(files[i].getName());
}
model.addAttribute("files", fileName);return "showDownFiles";
}/**
* 執行下載*/@RequestMapping("down")publicString down(@RequestParam String filename,
HttpServletRequest request, HttpServletResponse response) {
String aFilePath= null; //要下載的文件路徑
FileInputStream in = null; //輸入流
ServletOutputStream out = null; //輸出流
try{//從workspace\.metadata\.plugins\org.eclipse.wst.server.core\//tmp0\wtpwebapps下載
aFilePath = request.getServletContext().getRealPath("uploadfiles");//設置下載文件使用的報頭
response.setHeader("Content-Type", "application/x-msdownload");
response.setHeader("Content-Disposition", "attachment; filename="
+toUTF8String(filename));//讀入文件
in = new FileInputStream(aFilePath + "\\" +filename);//得到響應對象的輸出流,用于向客戶端輸出二進制數據
out =response.getOutputStream();out.flush();int aRead = 0;byte b[] = new byte[1024];while ((aRead = in.read(b)) != -1 & in != null) {out.write(b, 0, aRead);
}out.flush();in.close();out.close();
}catch(Throwable e) {
e.printStackTrace();
}
logger.info("下載成功");return null;
}/**
* 下載保存時中文文件名的字符編碼轉換方法*/
publicString toUTF8String(String str) {
StringBuffer sb= newStringBuffer();int len =str.length();for (int i = 0; i < len; i++) {//取出字符中的每個字符
char c =str.charAt(i);//Unicode碼值為0~255時,不做處理
if (c >= 0 && c <= 255) {
sb.append(c);
}else { //轉換 UTF-8 編碼
byteb[];try{
b= Character.toString(c).getBytes("UTF-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
b= null;
}//轉換為%HH的字符串形式
for (int j = 0; j < b.length; j++) {int k =b[j];if (k < 0) {
k&= 255;
}
sb.append("%" +Integer.toHexString(k).toUpperCase());
}
}
}returnsb.toString();
}
}
2)創建文件列表頁面
下載文件示例需要一個顯示被下載文件的JSP頁面 showDownFiles.jsp,代碼如下:
Insert title here| 被下載的文件名 |
${filename} |
總結
以上是生活随笔為你收集整理的java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 来电语音播报软件下载apk_消息语音播报
- 下一篇: cmake取消宏定义_Excel基础丨取