SpringMVC檔案上傳與下載(附工程原始碼)

王東昇KevinTech發表於2018-08-02

1  實現步驟

1.1 引入核心JAR包

SpringMVC實現檔案上傳,需要再新增兩個jar包。一個是檔案上傳的jar包,一個是其所依賴的IO包。這兩個jar包,均在Spring支援庫的org.apache.commons中。


1.2 書寫控制器方法

 FileUpController.java 完整

@Controller
public class FileUpController {

	@RequestMapping("/")
	public String index() {
		return "index";
	}
	
	@RequestMapping(value="upload",method=RequestMethod.POST)
	public String upload(MultipartFile myFile,Model model,HttpServletRequest request) {
	
		//獲取上傳圖片儲存目錄
		String path = request.getSession().getServletContext().getRealPath("upload");
		System.out.println(path);
		//獲取檔名並使用UUID生成新檔名
		String fileName  = myFile.getOriginalFilename();
		String newFileName = UUID.randomUUID()+fileName.substring(fileName.lastIndexOf("."));
		//在指定上傳儲存目錄中建立新檔案
		File targetFile = new File(path,newFileName);
		//找不到指定上傳圖片儲存目錄,就新建立此目錄
		if(!targetFile.exists()) {
			targetFile.mkdirs();
		}
		//將檔案寫入硬碟
		try {
			myFile.transferTo(targetFile);
		} catch (IllegalStateException | IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//將上傳後的檔案路徑傳到view
		model.addAttribute("fileUrl", request.getContextPath()+"/upload"+newFileName);
		
		return "upload";
	}
	
	
}

 


applicationContext.xml:

注:必須建立MultipartFile例項。要不出現500錯誤


index.jsp頁面:需指定 enctype="multipart/form-data 

<body>

   <form action="${pageContext.request.contextPath }/first.do" method="post" enctype="multipart/form-data">

   <h2>檔案上傳</h2>

                檔案:<input type="file" name="uploadFile"/><br/><br/>

      <input type="submit" value="上傳"/>

   </form>

 </body>


 實現效果:  


2  沒有選擇要上傳的檔案&&限制檔案上傳型別

 如果沒有選擇要上傳的檔案,可以通過如下判斷程式碼回到錯誤頁,並配置異常類

<!-- 配置異常類  報錯 -->

    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">

    <property name="defaultErrorView" value="/error.jsp"></property>

    </bean>


 


3  多檔案上傳 

 

實現效果:


4  檔案下載

 

	
<a href="${pageContext.request.contextPath }/download.do?line.jpg">下載</a>

DownloadControll.java 完整 

@Controller
public class DownloadController {
    @RequestMapping(value="download",method=RequestMethod.GET)
    public ResponseEntity<byte[]> download(String filename,HttpServletRequest request)throws Exception {
        //下載檔案路徑
        String path = request.getServletContext().getRealPath("upload");
        File file = new File(path + "/" + filename);
        //開始設定http請求頭
        HttpHeaders headers = new HttpHeaders();  
        //下載顯示的檔名,解決中文名稱亂碼問題  
        String downloadFileName = new String(filename.getBytes("UTF-8"),"ISO-8859-1");
        //通知瀏覽器以attachment(下載方式)開啟檔案。
        headers.setContentDispositionFormData("attachment", downloadFileName); 
        //設定mime:application/octet-stream : 二進位制流資料(最常見的檔案下載)。
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        return new ResponseEntity<byte[]>(
                       FileUtils.readFileToByteArray(file),    //把一個檔案轉換成位元組陣列返回
                       headers,                                                //http請求頭
                       HttpStatus.OK                                      //200
                   );  
    }
}

 實現效果:

專案原始碼下載--->>工程原始碼下載 

相關文章