這一篇簡單實現一個上傳文件的功能,上傳文件仍是常常用到的,好比上傳用戶頭像。其實上傳和下載的原理都同樣,都是對輸入輸出流進行操做。
1.使用java裏面的讀寫文件來實現
這裏主要使用了3個註解:@RestController,@PostMapping,@RequestParam 。
@RestController表示這個類是個控制器,能夠接收和響應網絡請求;@PostMapping配置了這個方法的訪問路徑,同時指定了請求方法爲post;@RequestParam是請求附帶的參數java
package com.spring.upload.controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by zhangyi on 2017/4/10. * 上傳文件控制器 */ @RestController public class UploadController { /** * 文件存儲路徑 */ private String path="F:\\UploadFile"; @PostMapping("/uploadFile") public String uploadFile(@RequestParam("file")MultipartFile file) throws IOException { String result; File parentFile=new File(path); if (!parentFile.exists()) { //若是文件存儲路徑,則建立 parentFile.mkdirs(); } //MultipartFile會對上傳的文件作一些封裝,因此要得到源文件名要用file.getOriginalFilename() File myFile=new File(parentFile,file.getOriginalFilename()); //下面就是java的一些基本東西了,建立文件,獲取輸入輸出流,讀寫文件 FileOutputStream out=null; InputStream in=null; try { myFile.createNewFile(); out=new FileOutputStream(myFile); in=file.getInputStream(); byte[] b=new byte[10*1024]; int n; while ((n=in.read(b))!=-1){ out.write(b,0,n); out.flush(); } result="success"; } catch (IOException e) { e.printStackTrace(); result="fail"; }finally { //最後關閉輸入輸出流,避免形成內存泄漏 if (out != null) { out.close(); } if (in != null) { in.close(); } } return result; } }
由於MultipartFile類的transferTo方法的封裝,因此上面那一段對輸入輸出流的操做,能夠換成下面的這段web
package com.spring.upload.controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.IOException; /** * Created by zhangyi on 2017/4/10. * 上傳文件控制器 */ @RestController public class UploadController { /** * 文件存儲路徑 */ private String path="F:\\UploadFile"; @PostMapping("/uploadFile") public String uploadFile(@RequestParam("file")MultipartFile file) { String result; File parentFile=new File(path); if (!parentFile.exists()) { //若是文件存儲路徑,則建立 parentFile.mkdirs(); } //MultipartFile會對上傳的文件作一些封裝,因此要得到源文件名要用file.getOriginalFilename() File myFile=new File(parentFile,file.getOriginalFilename()); try { file.transferTo(myFile); result="success"; } catch (IOException e) { e.printStackTrace(); result="fail"; } return result; } }