解決SpringBoot文件上傳臨時(shí)目錄找不到的問題
SpringBoot文件上傳臨時(shí)目錄問題
我相信大家在把項(xiàng)目部署到服務(wù)器上面時(shí)候都會遇到這樣一個(gè)問題:
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ǎng)上找了都沒有找到解決方案,唯一解決辦法就是指定臨時(shí)目錄到服務(wù)器就ok.不廢話啦上代碼。
1、前臺肯定是搭配multipart/form-data springMvc這個(gè)組件上傳滴
2、后臺代碼 參考就行了我這里用了SFTP上傳文件到云服務(wù)器
文件上傳工具參考這篇文章
//www.dbjr.com.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工具類生成新的文件名,新文件名 = newName + 文件后綴 String newName = IDUtils.genImageName(); newName = newName + oldName.substring(oldName.lastIndexOf(".")); SftpUtils ft = new SftpUtils(); //通過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查詢項(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ù)文件沒有刪除!"); } } } catch (Exception e) { e.printStackTrace(); return R.error(); } return R.error(); }else { return R.error("上傳error"); } }
其中/usr/fjl/file 是服務(wù)器路徑的地址
3、那么問題來了現(xiàn)在這樣肯定是不能解決上傳問題滴
(重點(diǎn)配置)新增一個(gè)配置 :這個(gè)代碼很關(guān)鍵,這個(gè)就是指定臨時(shí)上傳路徑的臨時(shí)地址(本地也會報(bào)錯)
@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開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇文章主要介紹了SpringMVC的相關(guān)知識。同時(shí)也會介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實(shí)現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來看下吧2017-04-04java全角、半角字符的關(guān)系以及轉(zhuǎn)換詳解
這篇文章主要介紹了2013-11-11Java集合框架之List ArrayList LinkedList使用詳解刨析
早在 Java 2 中之前,Java 就提供了特設(shè)類。比如:Dictionary, Vector, Stack, 和 Properties 這些類用來存儲和操作對象組。雖然這些類都非常有用,但是它們?nèi)鄙僖粋€(gè)核心的,統(tǒng)一的主題。由于這個(gè)原因,使用 Vector 類的方式和使用 Properties 類的方式有著很大不同2021-10-10Java easyui樹形表格TreeGrid的實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java easyui樹形表格TreeGrid的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢報(bào)錯的方法
這篇文章主要介紹了解決mybatis-plus3.1.1版本使用lambda表達(dá)式查詢報(bào)錯的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08SpringBoot自定義starter啟動器的實(shí)現(xiàn)思路
這篇文章主要介紹了SpringBoot如何自定義starter啟動器,通過starter的自定義過程,能夠加深大家對SpringBoot自動配置原理的理解,需要的朋友可以參考下2022-10-10使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解
這篇文章主要介紹了使用synchronized實(shí)現(xiàn)一個(gè)Lock代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12