有一說一,在之前的Java web項目裏我還沒有學過文件上傳的操作,只在做PHP課設的時候用過文件上傳,所以只能算是初步瞭解下。
文件上傳
單文件上傳
下載jar包
在springmvc.xml配置文件中配置CommonsMultipartResolver
方便自己以後用:
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--設置上傳文件的最大尺寸爲1MB -->
<property name="maxUploadSize" value="1048576"></property>
<!--字符編碼 -->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
寫文件上傳的表單頁面
控制器
package com.springmvc.controller;
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class fileUploadController {
@RequestMapping(value = "/fileUpload")
public String fileUpload(@RequestParam(value = "file",required=false)MultipartFile file,HttpServletRequest request,ModelMap model) {
//服務器端upload文件夾物理路徑
String path = request.getSession().getServletContext().getRealPath("upload");
//獲取文件名
String fileName = file.getOriginalFilename();
//實例化一個file對象,表示目標文件(含物理路徑)
File targetFile=new File(path,fileName);
//如果目錄不存在,就創建目錄
if (!targetFile.exists()) {
targetFile.mkdirs();
}
try {
//將上傳文件寫到服務器上的指定位置
file.transferTo(targetFile);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
model.put("fileUrl", request.getContextPath()+"/upload/"+fileName);//然後再success頁面就能讀到這個
return "success";
}
}
跳轉到的成功頁面,el表達式輸出路徑
選擇文件,點擊上傳後
那麼這個圖片在哪呢?他是在服務器端的upload文件夾下,不是我們的項目文件夾。
有這樣幾個事情要說明
- 我的項目發佈路徑沒有更改過,所以是這個路徑。
多文件上傳
感覺聽上去像時發動態的時候選照片的操作,可以選多張然後上傳。
可以通過對方法參數中參數設置爲@RequestParam(“files”)MultipartFile[]files的數組形式,這樣可提交多個文件
文件上傳界面
@RequestMapping(value = "/upload")
public String upload(@RequestParam("description") String description,
@RequestParam(value = "files",required=false)List<MultipartFile> files,HttpServletRequest request) {
//判斷文件上傳是否存在
if (!files.isEmpty()&&files.size()>0) {
//循環輸出上傳的文件
for (MultipartFile file : files) {
//獲取上傳的原始文件名稱
String originalFilename = file.getOriginalFilename();
//獲取上傳文件的保存地址目錄
String dirpath = request.getServletContext().getRealPath("/upload/");
File filePath = new File(dirpath);
//如果保存的文件地址,就先創建目錄
if (!filePath.exists()) {
filePath.mkdirs();
}
//使用UUID重命名上傳的新文件名(文件描述_uuid_原始文件名稱)
String newFileName=description+"_"+UUID.randomUUID()+"_"+originalFilename;
try {
file.transferTo(new File(dirpath+newFileName));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
return "error";
}
}return "success";
}
return "error";
}
然後寫個失敗了跳轉的頁面,此處省略
運行,選擇文件時,先點擊一個然後ctrl點擊另一個這樣選擇多個,然後上傳
其實我沒明白uuid是幹嘛的。好像是讓文件名隨機。
文件下載
文件下載就是將文件服務器中的文件下載到本機,直接在頁面給一個超鏈接,該鏈接的href屬性等與要下載文件的文件名,就可以實現文件下載了。
先說要實現的東西吧,感覺他這個講的挺迷的,他應該是偷了個懶,想直接下載了剛上傳到服務器的圖片
效果:
點擊後自動下載
更改success頁面
在success頁面有個連接,點擊後會下載
那麼要獲取文件名就要
然後
@RequestMapping(value = "/fileDownload")
public ResponseEntity<byte[]> fileDownload(HttpServletRequest request,
@RequestParam("fileName") String fileName,Model model) throws Exception{
//下載文件路徑
String path = request.getServletContext().getRealPath("/upload/");
//創建文件對象
File file = new File(path+File.separator+fileName);
//設置響應頭
HttpHeaders headers = new HttpHeaders();
//下載顯示的文件名,解決中文名亂碼問題
String downloadFileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
//通知瀏覽器以下載方式(attachement)打開文件
headers.setContentDispositionFormData("attachement", downloadFileName);
//定義以二進制流數據(最常見的文件下載)的形式下載返回文件數據
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
//使用spring MVC框架的
return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers,HttpStatus.CREATED);
}
最後提示一點,這個FileUtils是org.apache.commons.io.FileUtils。別導錯包了。
另外中文亂碼跟瀏覽器有關,新的瀏覽器,比如我用的火狐,chrome都沒問題。