解決SpringBoot文件上傳臨時(shí)目錄找不到的問(wèn)題
SpringBoot文件上傳臨時(shí)目錄問(wèn)題
我相信大家在把項(xiàng)目部署到服務(wù)器上面時(shí)候都會(huì)遇到這樣一個(gè)問(wèn)題:
org.springframework.web.multipart.MultipartException: Could not parse multipart servlet
request;nested exception is java.io.IOException: The temporary upload location
[/tmp/tomcat.1337767218595042057.80/work/Tomcat/localhost/ROOT] is not valid
org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipart
HttpServletRequest.java:112) org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.
這個(gè)問(wèn)題也是困惑我很久,網(wǎng)上找了都沒(méi)有找到解決方案,唯一解決辦法就是指定臨時(shí)目錄到服務(wù)器就ok.不廢話啦上代碼。
1、前臺(tái)肯定是搭配multipart/form-data springMvc這個(gè)組件上傳滴
2、后臺(tái)代碼 參考就行了我這里用了SFTP上傳文件到云服務(wù)器
文件上傳工具參考這篇文章
//chabaoo.cn/article/216456.htm
@Log("文件上傳") @ResponseBody @PostMapping("/upload") @RequiresPermissions("common:companyremittance:upload") R upload(@RequestParam("file") MultipartFile file,@RequestParam("arrys") String arrys, @RequestParam("commpanyname") String commpanyname,@RequestParam("remittancedate") String remittancedate,HttpServletRequest request) throws ParseException, IOException { //先上傳到圖片服務(wù)器上面然后在讀取信息 int prostatusId=0; if(StringUtils.isEmpty(arrys)){ return R.error("導(dǎo)入失敗"); } String oldName = file.getOriginalFilename(); //使用IDUtils工具類(lèi)生成新的文件名,新文件名 = newName + 文件后綴 String newName = IDUtils.genImageName(); newName = newName + oldName.substring(oldName.lastIndexOf(".")); SftpUtils ft = new SftpUtils(); //通過(guò)SFtoInfo 參數(shù)連接傳入?yún)?shù)即可 Session s = ft.getSession(SFTPInfo.SFTP_REQ_HOST,SFTPInfo.SFTP_DEFAULT_PORT, SFTPInfo.SFTP_REQ_USERNAME,SFTPInfo.SFTP_REQ_PASSWORD); Channel channel = ft.getChannel(s); ChannelSftp sftp = (ChannelSftp)channel; Boolean upload = ft.uploadFile(sftp,SFTPInfo.basePath, file.getInputStream(),newName); SaveDO saveDO=new SaveDO(); if(upload){ //上傳成功關(guān)閉信息 saveDO.setFileurl(SFTPInfo.baseUrl+ "/" + newName); saveDO.setFilename(oldName); saveDO.setFilesize(String.valueOf(file.getSize())); saveDO.setImportdate(new Date()); saveDO.setIpaddr(IPUtils.getIpAddr(request)); saveDO.setUsername(ShiroUtils.getUser().getUsername()); saveDO.setSftpupurl("/usr/fjl/file"); //這里是文件路徑上傳服務(wù)器里面路徑 記得chomd 777 saveDO.setNewfilename(newName); saveService.save(saveDO); //根據(jù)proentId查詢(xún)項(xiàng)目的狀態(tài) CompanyremittanceDO companyremittanceDO1=new CompanyremittanceDO(); companyremittanceDO1.setProparentid(Long.valueOf(arrys)); CompanyremittanceDO aDo = companyremittanceService.getProjectStatus(arrys); if (aDo != null) { companyremittanceDO1.setProstatus(aDo.getProstatus()); } else { //自增狀態(tài)++1 prostatusId = companyremittanceService.getMaxProStatus(); prostatusId++; companyremittanceDO1.setProstatus(prostatusId); } companyremittanceDO1.setRemittancename(commpanyname); companyremittanceDO1.setRemittancedate(getDate(remittancedate)); String fileName = file.getOriginalFilename(); fileName = FileUtil.renameToUUID(fileName); try { boolean flag= ExcelUtil.batchImport(fileName,file,companyremittanceService,companyremittanceDO1); if(flag){ if(ft.delete(saveDO.getSftpupurl(),saveDO.getNewfilename(),sftp)){ ft.closeAll(sftp, channel, s); //關(guān)閉連接 return R.ok("導(dǎo)入成功"); }else{ return R.ok("數(shù)據(jù)導(dǎo)入成功!服務(wù)器數(shù)據(jù)文件沒(méi)有刪除!"); } } } catch (Exception e) { e.printStackTrace(); return R.error(); } return R.error(); }else { return R.error("上傳error"); } }
其中/usr/fjl/file 是服務(wù)器路徑的地址
3、那么問(wèn)題來(lái)了現(xiàn)在這樣肯定是不能解決上傳問(wèn)題滴
(重點(diǎn)配置)新增一個(gè)配置 :這個(gè)代碼很關(guān)鍵,這個(gè)就是指定臨時(shí)上傳路徑的臨時(shí)地址(本地也會(huì)報(bào)錯(cuò))
@Bean MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //factory.setLocation("D:/tmp"); 本地用 factory.setLocation("/home/temp"); //服務(wù)器用 return factory.createMultipartConfig(); }
加上這個(gè)就好了 文件就可以上傳成功,如果跨域還得到nginx 里面配置和代碼配置.
SpringBoot更改上傳文件臨時(shí)目錄
@Bean MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation(tmepPath); return factory.createMultipartConfig(); }
再Application.java里增加上述代碼。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaEE開(kāi)發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇文章主要介紹了SpringMVC的相關(guān)知識(shí)。同時(shí)也會(huì)介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實(shí)現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來(lái)看下吧2017-04-04java全角、半角字符的關(guān)系以及轉(zhuǎn)換詳解
這篇文章主要介紹了2013-11-11帶你一文深入認(rèn)識(shí)Java?String類(lèi)
這篇文章主要介紹了帶你一文深入認(rèn)識(shí)Java?String類(lèi),String 類(lèi)在Java中是很常用的類(lèi),很重要的類(lèi),在后續(xù)的學(xué)習(xí)中經(jīng)常會(huì)用到,是后續(xù)學(xué)習(xí)的基礎(chǔ), 文章圍繞主題展開(kāi)更多詳細(xì)內(nèi)容,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-06-06Java集合框架之List ArrayList LinkedList使用詳解刨析
早在 Java 2 中之前,Java 就提供了特設(shè)類(lèi)。比如:Dictionary, Vector, Stack, 和 Properties 這些類(lèi)用來(lái)存儲(chǔ)和操作對(duì)象組。雖然這些類(lèi)都非常有用,但是它們?nèi)鄙僖粋€(gè)核心的,統(tǒng)一的主題。由于這個(gè)原因,使用 Vector 類(lèi)的方式和使用 Properties 類(lèi)的方式有著很大不同2021-10-10Java easyui樹(shù)形表格TreeGrid的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java easyui樹(shù)形表格TreeGrid的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢(xún)報(bào)錯(cuò)的方法
這篇文章主要介紹了解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢(xún)報(bào)錯(cuò)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringBoot自定義starter啟動(dòng)器的實(shí)現(xiàn)思路
這篇文章主要介紹了SpringBoot如何自定義starter啟動(dòng)器,通過(guò)starter的自定義過(guò)程,能夠加深大家對(duì)SpringBoot自動(dòng)配置原理的理解,需要的朋友可以參考下2022-10-10使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解
這篇文章主要介紹了使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12