Java实现用户头像上传(修改默认文件大小限制)
概述
每次說(shuō)起文件上傳,就不得不提一下前端的實(shí)現(xiàn)方式,說(shuō)來(lái)也奇怪,本博主最熱門的博客居然也是文件上傳,3萬(wàn)多的訪問(wèn)量占了總訪問(wèn)量的一多半:《傳統(tǒng)form表單提交方式的文件上傳與文件存儲(chǔ)》,而且,今天搜索“form表單提交文件” 百度第一篇居然就是這篇自己寫(xiě)的文章(下圖留個(gè)紀(jì)念,不知道以后會(huì)不會(huì)有變化 哈哈)
但是由于這篇文章寫(xiě)得比較早,博客玩的還不6,文章排版很糟糕,因此自己都不愿意看,今天完成了一個(gè)類似的功能:用戶頭像上傳,特此重寫(xiě)一篇,鞏固記憶。
本功能涉及到的幾個(gè)知識(shí)點(diǎn):
1、controller層的接收方式
2、IO流相關(guān)的文件保存處理(路徑問(wèn)題、寫(xiě)出方式)
3、spring boot 自帶tomcat上傳文件最大值限制的設(shè)置
4、分系統(tǒng)分路徑(Windows 或 Linux)
5、文件保存的常規(guī)實(shí)現(xiàn)思路
實(shí)現(xiàn)過(guò)程
控制器接收方式
以全棧的角度來(lái)分析這個(gè)功能,當(dāng)然少不了前端的實(shí)現(xiàn),但是目前多以前后端分離的方式來(lái)開(kāi)發(fā)功能,因此,本篇博客著重講解后端的spring boot的寫(xiě)法,這是本人認(rèn)為比較工整的寫(xiě)法,對(duì)于前端的實(shí)現(xiàn),可以看本篇博客的補(bǔ)充篇《傳統(tǒng)form表單提交方式的文件上傳與文件存儲(chǔ)》。
Controller的接收方式如下:
@ApiOperation(value = "設(shè)置用戶頭像", notes = "設(shè)置當(dāng)前用戶頭像")@PutMapping("/profiles")public SystemResult setUserProfile(@RequestParam(required = true) MultipartFile profile) {return userService.updUserProfile(profile);}請(qǐng)求方式是PUT,required = true,參數(shù)類型為MutipartFile ?,只要是Spring 生態(tài)的應(yīng)用程序,文件的接收都是使用MutipartFile這個(gè)類型,它表示通過(guò) mutipart 請(qǐng)求上傳了的一個(gè)文件。如果多個(gè)文件上傳,那就用數(shù)組,如 MutipartFile[] 。
Service處理
Controller接收到文件后,Service需要完成兩個(gè)大方向的處理:1、保存文件;2、路徑存庫(kù)
@Overridepublic SystemResult updUserProfile(MultipartFile newProfile) {// 根據(jù)Windows和Linux配置不同的頭像保存路徑String OSName = System.getProperty("os.name");String profilesPath = OSName.toLowerCase().startsWith("win") ? SystemConstant.WINDOWS_PROFILES_PATH: SystemConstant.LINUX_PROFILES_PATH;if (!newProfile.isEmpty()) {// 當(dāng)前用戶User currentUser = (User) SecurityUtils.getSubject().getPrincipal();String profilePathAndNameDB = userDao.selectUserById(currentUser.getUserId()).getProfilePath();// 默認(rèn)以原來(lái)的頭像名稱為新頭像的名稱,這樣可以直接替換掉文件夾中對(duì)應(yīng)的舊頭像String newProfileName = profilePathAndNameDB;// 若頭像名稱不存在if (profilePathAndNameDB == null || "".equals(profilePathAndNameDB)) {newProfileName = profilesPath+ System.currentTimeMillis()+ newProfile.getOriginalFilename();// 路徑存庫(kù)currentUser.setProfilePath(newProfileName);userDao.updateUserProfilePath(currentUser);}// 磁盤(pán)保存BufferedOutputStream out = null;try {File folder = new File(profilesPath);if (!folder.exists())folder.mkdirs();out = new BufferedOutputStream(new FileOutputStream(newProfileName));// 寫(xiě)入新文件out.write(newProfile.getBytes());out.flush();} catch (Exception e) {e.printStackTrace();return new SystemResult(HttpStatus.OK.value(), "設(shè)置頭像失敗", Boolean.FALSE);} finally {try {out.close();} catch (IOException e) {e.printStackTrace();}}return new SystemResult(HttpStatus.OK.value(), "設(shè)置頭像成功", Boolean.TRUE);} else {return new SystemResult(HttpStatus.OK.value(), "設(shè)置頭像失敗", Boolean.FALSE);}}注釋寫(xiě)的比較細(xì),文件的命名,以及目錄的創(chuàng)建,也不需要多說(shuō)什么了。
關(guān)于兩個(gè)系統(tǒng)中使用的路徑,雖然Windows系統(tǒng)中都是使用反斜杠“\” ,但是在Java中反斜杠需要轉(zhuǎn)義,比如:“C:\\用戶\\文件夾\\文件.txt”,這樣,在存入數(shù)據(jù)庫(kù)的時(shí)候也會(huì)比較難看,后來(lái)經(jīng)過(guò)測(cè)試發(fā)現(xiàn)在Java中使用“/”也是沒(méi)問(wèn)題的。上述代碼兩個(gè)路徑常量如下:
/** 頭像保存路徑 */public static final String WINDOWS_PROFILES_PATH = "C:/super_meeting/profiles/";public static final String LINUX_PROFILES_PATH = "/root/super_meeting/profiles/";另外,當(dāng)前用戶的獲取是通過(guò)shiro中的安全管理器SecurityManager來(lái)取得的,我們也可以讓頁(yè)面?zhèn)魅胍粋€(gè)用戶的ID(如果頁(yè)面知道的話)這樣就適用于任何使用場(chǎng)景了。
修改文件上傳限制
如果做到上一步,當(dāng)你上傳的文件過(guò)大,可能總是會(huì)報(bào)如下異常:
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field profile exceeds its maximum permitted size of 1048576 bytes.可以看到這是Spring Boot自帶的tomcat對(duì)上傳文件大小的限制,我們需要增加一個(gè)配置信息:
@Configuration public class CommonConfiguration {/*** 文件上傳配置,在application配置文件中設(shè)置不起作用!*/@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();// 單個(gè)文件最大factory.setMaxFileSize("10240KB"); // KB,MB// 設(shè)置總上傳數(shù)據(jù)總大小factory.setMaxRequestSize("102400KB");return factory.createMultipartConfig();} }網(wǎng)上還有直接寫(xiě)在application.properties文件中的方式,但是本人親測(cè)不管用,雖然不是很喜歡這種配置類的書(shū)寫(xiě)方式,但也沒(méi)什么辦法,湊合著用吧。
配置文件的寫(xiě)法如下,如果哪位測(cè)試可用的話,請(qǐng)文末留言告訴我!!!文末留言告訴我!!!告訴我!!!
spring.http.multipart.maxFileSize = 10Mb
spring.http.multipart.maxRequestSize=100Mb
?測(cè)試
查詢數(shù)據(jù)庫(kù):
打開(kāi)swagger選擇一張圖片,或者你自己寫(xiě)一個(gè)form表單,都可以。
?
檢查一下?系統(tǒng)盤(pán):
數(shù)據(jù)庫(kù):
完美!!
綜上,就是文件上傳的全過(guò)程,其中省略了DAO層的代碼,不過(guò)這個(gè)不是重點(diǎn),重點(diǎn)還是我在概述中列出的那幾項(xiàng)。如果有任何問(wèn)題,請(qǐng)文末留言。
?
總結(jié)
以上是生活随笔為你收集整理的Java实现用户头像上传(修改默认文件大小限制)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: FFmpeg在Ubuntu的安装以及教程
- 下一篇: Java网络编程————UDP实现Thi