transferto 文件不存在_文件上傳時,MultipartFile.transferTo() 方法報 FileNotFoundException...

Spring Upload?File 報錯FileNotFoundException

環境:

Springboot2.0.4JDK1.8內嵌 Apache Tomcat/8.5.32

1、前端代碼

前端上傳網頁表單,enctype 和 input 的type=file 即可,使用單文件上傳舉例:

圖片

2、后端代碼

@RestController

@RequestMapping("/file")public classUploadFileController {

@Value("${file.upload.path}")private String path = "upload/";

@RequestMapping(value= "fileUpload", method =RequestMethod.POST)

@ResponseBodypublic String fileUpload(@RequestParam("file") MultipartFile file) {if(file.isEmpty()) {return "false";

}

String fileName=file.getOriginalFilename();

File saveFile= new File(path + "/" +fileName);if (!saveFile.getParentFile().exists()) {

saveFile.getParentFile().mkdirs();

}try{

file.transferTo(saveFile);//保存文件

return "true";

}catch(Exception e) {

e.printStackTrace();return "false";

}

}

}

3、問題分析與解決

按照上面配置運行時,在保存文件 file.transferTo(saveFile) 報錯

3.1 問題原因分析:

saveFile是相對路徑,指向 upload/doc20170816162034_001.jpg

file.transferTo 方法調用時,判斷如果是相對路徑,則使用temp目錄,為父目錄

因此,實際保存位置為 C:\Users\xxxx\AppData\Local\Temp\tomcat.372873030384525225.8080\work\Tomcat\localhost\ROOT\upload\doc20170816162034_001.jpg

一則,位置不對,二則沒有父目錄存在,因此產生上述錯誤。

3.2?問題解決

transferTo 傳入參數 定義為絕對路徑

@RestController

@RequestMapping("/file")public classUploadFileController {

@Value("${file.upload.path}")private String path = "upload/";

@RequestMapping(value= "fileUpload", method =RequestMethod.POST)

@ResponseBodypublic String fileUpload(@RequestParam("file") MultipartFile file) {if(file.isEmpty()) {return "false";

}

String fileName=file.getOriginalFilename();

File dest= new File(new File(path).getAbsolutePath()+ "/" +fileName);if (!dest.getParentFile().exists()) {

dest.getParentFile().mkdirs();

}try{

file.transferTo(dest);//保存文件

return "true";

}catch(Exception e) {

e.printStackTrace();return "false";

}

}

}

也可以 file.getBytes() 獲得字節數組,OutputStream.write(byte[] bytes)自己寫到輸出流中。

4、補充方法

application.properties 中增加配置項

spring.servlet.multipart.location= # Intermediate location of uploaded files.

關于上傳文件的訪問

增加一個自定義的ResourceHandler把目錄公布出去

//寫一個Java Config

@Configurationpublic class webMvcConfig implementsorg.springframework.web.servlet.config.annotation.WebMvcConfigurer{//定義在application.properties

@Value("${file.upload.path}")private String path = "upload/";public voidaddResourceHandlers(ResourceHandlerRegistry registry) {

String p= new File(path).getAbsolutePath() + File.separator;//取得在服務器中的絕對路徑

System.out.println("Mapping /upload/** from " +p);

registry.addResourceHandler("/upload/**") //外部訪問地址

.addResourceLocations("file:" + p)//springboot需要增加file協議前綴

.setCacheControl(CacheControl.maxAge(30, TimeUnit.MINUTES));//設置瀏覽器緩存30分鐘

}

}

application.properties 中 file.upload.path=upload/

實際存儲目錄

D:/upload/2019/03081625111.jpg

訪問地址(假設應用發布在http://www.a.com/)

http://www.a.com/upload/2019/03081625111.jpg

在Controller中增加一個RequestMapping,把文件輸出到輸出流中

@RestController

@RequestMapping("/file")public classUploadFileController {

@AutowiredprotectedHttpServletRequest request;

@AutowiredprotectedHttpServletResponse response;

@AutowiredprotectedConversionService conversionService;

@Value("${file.upload.path}")private String path = "upload/";

@RequestMapping(value="/view", method =RequestMethod.GET)public Object view(@RequestParam("id") Integer id){//通常上傳的文件會有一個數據表來存儲,這里返回的id是記錄id

UploadFile file = conversionService.convert(id, UploadFile.class);//這步也可以寫在請求參數中

if(file==null){throw new RuntimeException("沒有文件");

}

File source= new File(new File(path).getAbsolutePath()+ "/" +file.getPath());

response.setContentType(contentType);try{

FileCopyUtils.copy(newFileInputStream(source), response.getOutputStream());

}catch(Exception e) {

e.printStackTrace();

}return null;

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259861.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

對“粘連”footer布局的思考和總結

經典的"粘連"footer布局 參考文章鏈接在文章末尾&#xff0c;簡單的語言總結如下&#xff1a; 經典的“粘連”footer布局就是。我們有一塊內容<main>。當<main>的高度足夠長的時候&#xff0c;緊跟在<main>后面的元素<footer>會跟在<main…

計算機函數公式一等獎怎么算,信息技術應用 用計算機畫函數圖象教案設計(一等獎)...

衛鵬展地區&#xff1a; 湖北省 - 黃岡市 - 英山縣學校&#xff1a;英山縣金鋪鎮金鋪中學 共1課時信息技術應用 用計算機畫函數圖象">信息技術應用 用計算機畫… 初中數學 人教2011課標版 1教學目標1&#xff0e;結合具體情境理解一次函數的意義&#xff0c;能結…

這樣去寫你的 HTML

昨天在 twitter 上說&#xff0c;怎么忍心把頁面寫得這么難用&#xff1f;是的&#xff0c;這個世界還有一群人等著我們創建出來的東西&#xff0c;可以讓他們的生活能過得更容易呢。比如那些需要讀屏軟件的用戶。作為一個前端&#xff0c;我們又怎么會忍心呢。之前就一直想寫這…

iframe懶加載_前端常見問題

原地址&#xff1a;https://blog.csdn.net/Mr_JavaScript/article/details/843110681. flex布局&#xff1a;又叫做彈性布局任何一個容器都可以指定flex布局&#xff0c;如display:flex 或 display:inline-flex注意&#xff1a;設置了flex布局以后&#xff0c;子元素的float&am…

手機運行服務器無響應,《最強蝸牛》服務器無響應怎么辦 服務器無響應解決方法...

導讀最強蝸牛服務器無響應怎么辦&#xff1f;本作在今日迎來了正式的公測&#xff0c;這會導致大批量的玩家同時涌入進來&#xff0c;而服務器也因此而遭受到了非常大的符合&#xff0c;所以會導致后續加入進來的玩家出現服務器無響應進不去的現象。下面就為大家帶...最強蝸牛服…

Android 開源框架Universal-Image-Loader學習

Android 開源框架Universal-Image-Loader完全解析&#xff08;一&#xff09;--- 基本介紹及使用 Android 開源框架Universal-Image-Loader完全解析&#xff08;二&#xff09;--- 圖片緩存策略詳解 Android 開源框架Universal-Image-Loader完全解析&#xff08;三&#xff09;…

自己動手寫操作系統--個人實踐

近期開始看于淵的《自己動手寫操作系統》這本書&#xff0c;剛開始看就發現做系統的引導盤居然是軟盤&#xff01;心里那個汗啊&#xff01; 如今都是U盤了&#xff0c;誰還用軟盤。于是考慮用U盤。 于是開始下面步驟&#xff1a; 1、既然書上說給先要把軟盤做引導盤&#xff0…

蔻馳和mk哪個更大牌_mk和coach哪個好?mk和coach包包是一個檔次嗎?

說到包包&#xff0c;mk和coach可謂是輕奢界的兩大巨頭了。因此&#xff0c;兩個品牌的包包不可避免的會被經常拿來作比較。那么&#xff0c;從各個角度來講mk和coach那款包包更好呢&#xff1f;這兩款包包又有哪些本質上的區別呢&#xff1f;mk和coach哪個好價格對比大致上&am…

Linux 配置 swap 區

Linux 配置 swap 區 很多時候我們需要配置 swap 主要的原因是物理內存太貴了&#xff0c; 服務器也是一樣&#xff0c; 當內存不夠用時&#xff0c; 系統會卡死&#xff0c; 因此我們寧愿犧牲一點性能也要讓系統正常運行。 當然&#xff0c; 在系統物理內存足夠的條件下&#x…

嵊州職教中心計算機多少分數,嵊州中考考試分數線

每年六月份最熱鬧的大概就是中考了&#xff0c;很多人都想提前知道中考分數線&#xff0c;下面是百分網小編整理的嵊州2017年中考考試分數線&#xff0c;歡迎閱讀借鑒!嵊州2017年中考分數線2017年嵊州中考考試時間嵊州中考錄取情況1. 第一批 嵊州中學、馬寅初中學實驗班&#x…

12月和12年

剛剛撇了一眼&#xff0c;注冊博客園已經12年了。時間有時只是個數字&#xff0c;有沒有意義呢&#xff0c;自己去判斷啦。 像博客園這樣的技術社區&#xff0c;很是難得&#xff0c;雖然這個社區里.NET開發者才是一等公民。 我最喜歡的是它的博客系統的高度可Diy性。經常訪問我…

【2011-6】【奇數】

Description 鍵盤輸入一個奇數 P (P<50)&#xff0c;其個位數字不能是5&#xff0c;求一個整數 S&#xff0c;使 P*S 1111...1&#xff0c;即乘積各位都是1。要求用兩行依次輸出以下結果: ①S的全部數字&#xff1b;②乘積中數字1的個數。 例&#xff1a;輸入P3&#xff0c…

sql加上唯一索引后批量插入_阿里大佬總結的52條SQL語句性能優化策略,建議收藏...

你知道的越多&#xff0c;不知道的就越多&#xff0c;業余的像一棵小草&#xff01;你來&#xff0c;我們一起精進&#xff01;你不來&#xff0c;我和你的競爭對手一起精進&#xff01;編輯&#xff1a;業余草cnblogs.com/SimpleWu/p/9929043.html推薦&#xff1a;https://www…

Web緩存技術

本章導讀 緩存主要是為了提高數據的讀取速度。因為服務器和應用客戶端之間存在著流量的瓶頸&#xff0c;所以讀取大容量數據時&#xff0c;使用緩存來直接為客戶端服務&#xff0c;可以減少客戶端與服務器端的數據交互&#xff0c;從而大大提高程序的性能。 本章從緩存所在的命…

神武4手游服務器維護,神武4手游勢不可擋開服時間表_神武4手游新區開服預告_第一手游網手游開服表...

2020-06-1910:00新服天涯刀客已經開服2020-06-0510:00新服飛仙摘星已經開服2020-05-2910:00新服踏雪無痕已經開服2020-05-2210:00新服因緣際會已經開服2020-05-1910:00新服龍的傳人已經開服2020-05-1510:00新服鸞鳳和鳴已經開服2020-05-1211:40新服其疾如風已經開服2020-05-081…

BZOJ 4066 簡單題 ——KD-Tree套替罪羊樹

【題目分析】 直接x,y二維輪番劃分&#xff0c;暴力即可。 套上替罪羊&#xff0c;打碎重構&#xff0c;對于時間復雜度有了保證。 寫起來好麻煩&#xff0c;重構的技巧很棒&#xff01; 【代碼】 #include <cstdio> #include <cstring> #include <iostream>…

【HTML5初探之繪制圖像(上)】看我canvas元素引領下一代web頁面

弧度一塊可能有誤&#xff0c;需要再研究 導航 【初探HTML5之使用新標簽布局】用html5布局我的博客頁&#xff01; 【HTML5初探之form標簽】解放表單驗證、增加文件上傳、集成拖放 【HTML5初探之繪制圖像&#xff08;上&#xff09;】看我canvas元素引領下一代web頁面 【HTML5初…

或運算

邏輯或 ||int i, j, k;i 0x15;j 0x41;k i || j;反匯編代碼如下:MOV DWORD PTR SS:[EBP-4], 15MOV DWORD PTR SS:[EBP-C], 41CMP DWORD PTR SS:[EBP-4], 0JNZ SHORT asm_OR.00401029CMP DWORD PTR SS:[EBP-C], 0JNZ SHORT asm_OR.00401029MOV DWORD PTR SS:[EBP-10], 0JMP SH…

構造方法的調用順序和成員變量的初始化時機以及動態綁定

構造方法的調用順序&#xff1a;子類構造器中&#xff0c;JVM會自動的先調用父類的構造方法&#xff0c;然后再執行子類構造方法。在JVM自動調用父類構造方法的時候&#xff0c;會完成父類中擁有的成員變量的值的初始化操作&#xff0c;此時子類的成員變量并未初始化&#xff0…

Python interview_python

https://github.com/taizilongxu/interview_python 1 Python的函數參數傳遞 strings, tuples, 和numbers是不可更改的對象&#xff0c;而list,dict等則是可以修改的對象 2 Python中的元類(metaclass) 3 staticmethod和classmethod python 三個方法&#xff0c;靜態方法&#xf…