Spring 學習筆記_10_Spring MVC文件上傳和下載

有一說一,在之前的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文件夾下,不是我們的項目文件夾。
在這裏插入圖片描述
有這樣幾個事情要說明

  1. 我的項目發佈路徑沒有更改過,所以是這個路徑。

多文件上傳

感覺聽上去像時發動態的時候選照片的操作,可以選多張然後上傳。
可以通過對方法參數中參數設置爲@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都沒問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章