SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級(jí)問(wèn)題
前言
看標(biāo)題好像很簡(jiǎn)單的樣子,但是針對(duì)使用jar包發(fā)布SpringBoot項(xiàng)目就不一樣了。
當(dāng)你使用tomcat發(fā)布項(xiàng)目的時(shí)候,上傳文件存放會(huì)變得非常簡(jiǎn)單,因?yàn)槟憧梢噪S意操作項(xiàng)目路徑下的資源。但是當(dāng)你使用SpringBoot的jar包發(fā)布項(xiàng)目的時(shí)候,你會(huì)發(fā)現(xiàn),你不能像以前一樣操作文件了。當(dāng)你使用File file = new File()的時(shí)候根本不知道這個(gè)路徑怎么辦。而且總不能很小的項(xiàng)目也給它構(gòu)建一個(gè)文件服務(wù)器吧。所以這次就來(lái)解決這樣的問(wèn)題。
不想知道細(xì)節(jié)的,可以直接跳轉(zhuǎn)到最后封裝的部分,里面有相應(yīng)的實(shí)現(xiàn)。
原因
其實(shí)原因你也想的到,你無(wú)法對(duì)jar包里面的資源進(jìn)行操作,而對(duì)于springboot項(xiàng)目來(lái)說(shuō),你只能讀取里面的文件,只能使用InputStream。使用如下方式針對(duì)資源文件進(jìn)行讀取:
ClassPathResource classPathResource = new ClassPathResource("static/a.txt"); classPathResource.getInputStream();
其中,這個(gè)a.txt存放在resources/static目錄下
通過(guò)上述方式可以獲取a中的內(nèi)容
實(shí)現(xiàn)
因?yàn)槲覀儫o(wú)法操作jar包內(nèi)容,所以我們只能將文件存放在別的位置,與jar包同級(jí)的目錄是一個(gè)不錯(cuò)的選擇。
首先獲取根目錄
File path = new File(ResourceUtils.getURL("classpath:").getPath()); if(!path.exists()) { path = new File(""); }
然后獲取需要的目錄,我們?cè)O(shè)定我們需要將文件存放在與jar包同級(jí)的static的upload目錄下
File upload = new File(path.getAbsolutePath(),"static/upload/"); if(!upload.exists()) { upload.mkdirs(); }
然后當(dāng)我們要將上傳的文件存儲(chǔ)的時(shí)候,按照下面的方式去新建文件,然后使用你喜歡的方式進(jìn)行存儲(chǔ)就可以了。
File upload = new File(path.getAbsolutePath(),"static/upload/test.jpg"); FileUtils.copyInputStreamToFile(inputStream, uploadFile);
不要忘記
你需要在application.yml配置中加入以下代碼,指定兩個(gè)靜態(tài)資源的目錄,這樣你上傳的文件就能被外部訪問(wèn)到了。
spring: # 靜態(tài)資源路徑 resources: static-locations: classpath:static/,file:static/
這樣就能實(shí)現(xiàn)上傳文件
最后的封裝
工具類:
這個(gè)工具類依賴了
compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1' compile group: 'commons-io', name: 'commons-io', version: '2.4'
如何你不喜歡完全可以根據(jù)自己的喜歡改變
如何使用:
/** * 測(cè)試文件上傳 */ @RequestMapping("/upload") @ResponseBody public String upload(MultipartFile file) throws IOException { return "文件存放路徑為" + FileHandleUtil.upload(file.getInputStream(), "image/", file.getOriginalFilename()); }
最后效果
Follow up
這個(gè)工具類只是實(shí)現(xiàn)了如何上傳文件,入?yún)⒁仓挥蠭nputStream,后續(xù)如何你需要接入?yún)?shù)File或者加入文件名防重復(fù)等等,就由你來(lái)完成了。
總結(jié)
以上所述是小編給大家介紹的SpringBoot上傳文件到本服務(wù)器 目錄與jar包同級(jí)問(wèn)題,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
淺談HTTP使用BASIC認(rèn)證的原理及實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇淺談HTTP使用BASIC認(rèn)證的原理及實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-11-11Java+MyBatis+MySQL開(kāi)發(fā)環(huán)境搭建流程詳解
Java的MyBatis框架提供了強(qiáng)大的數(shù)據(jù)庫(kù)操作支持,這里我們先在本地的開(kāi)發(fā)環(huán)境中上手,來(lái)看一下Java+MyBatis+MySQL開(kāi)發(fā)環(huán)境搭建流程詳2016-06-06Java語(yǔ)法基礎(chǔ)之函數(shù)的使用說(shuō)明
函數(shù)就是定義在類中的具有特定功能的一段小程序,函數(shù)也稱為方法2013-07-07如何將eclipse項(xiàng)目導(dǎo)入到idea的方法步驟(圖文)
這篇文章主要介紹了如何將eclipse項(xiàng)目導(dǎo)入到idea的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03java使用CKEditor實(shí)現(xiàn)圖片上傳功能
這篇文章主要為大家詳細(xì)介紹了java使用CKEditor實(shí)現(xiàn)圖片上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07