摘要:采用間接注入的方式注入在中會在構造函數(shù)之后執(zhí)行同樣可以實現(xiàn)接口以上代碼注意處。需要說明的是,工具類,需要使用來讓其被管理。那么,你回顯成。即可完整代碼圖片上傳單位配置靜態(tài)路徑,多個可用逗號隔開陳少平獲取客戶端真實地址。
版本聲明:
springBoot: 1.5.9
jdk: 1.8
IDE: IDEA
注:此項目前后端分離
使用的方法是配置靜態(tài)目錄(類似tomcat的虛擬目錄映射)
1、配置靜態(tài)目錄
upload: image: path: G:/image/ spring: resources: #配置靜態(tài)路徑,多個可用逗號隔開 static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${upload.image.path}
2、編寫圖片上傳工具類
問題: 工具類有個字段是靜態(tài)的,無法使用spring注入。 采用間接注入的方式注入
@Resource(name = "uploadProperty") private UploadProperty tempUploadProperty; private static UploadProperty uploadProperty; // 在servlet中 會在構造函數(shù)之后執(zhí)行, 同樣可以實現(xiàn) InitializingBean 接口 @PostConstruct private void init(){ uploadProperty = tempUploadProperty; }
以上代碼注意2處。
1、需使用@Resource注解,注入Bean。使用@Autowired 注解報錯。 使用@Resource 注解 報 有2個相同的bean。但是我的工程中,卻只有1個UploadProperty。所以帶上Bean的名字
2、@PostConstruct:該注解會在構造函數(shù)之后執(zhí)行,或者,你也可以實現(xiàn)InitializingBean接口。 需要說明的是,工具類,需要使用@Component 來讓其被spring管理。 因為。 @PostConstruct 影響的是受spring管理bean的生命周期。
3、圖片的回顯
圖片的回顯,你只需將圖片的地址返給客戶端即可。
例如: 你配置的靜態(tài)目錄是 D:/images/ 。 如果你圖片的完整路徑是D:/images/test/12.png。
那么,你回顯成 http://ip/test/12.png。 即可
4、完整代碼
application.yml
server: port: 9999 context-path: / upload: #圖片上傳 image: path: G:/image/ max-size: 2 #單位MB accept-type: - image/png - image/jpeg - image/jpg spring: resources: #配置靜態(tài)路徑,多個可用逗號隔開 static-locations: classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${upload.image.path}
IOUtils
package com.hycx.common.util; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; /** * @author 陳少平 * @description * @create in 2018/2/11 23:13 */ public class HttpUtil { /** * 獲取客戶端真實IP地址。需考慮客戶端是代理上網(wǎng) * @param request * @return 客戶端真實IP地址 */ public static String getClientIp(HttpServletRequest request){ if(StringUtils.isEmpty(request.getHeader("x-forwarded-for"))) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); } /** * 獲取服務器地址 Http://localhost:8080/ 類似 * @param request * @return */ public static String serverBasePath(HttpServletRequest request) { return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); } }
UploadProperty
package com.hycx.common.property; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; /** * @author 陳少平 * @description * @create in 2018/2/14 23:22 */ @Component @ConfigurationProperties(prefix = "upload.image") public class UploadProperty { private String path; private int maxSize; private ListacceptType = new ArrayList<>(); public UploadProperty() { } @Override public String toString() { return "UploadProperty{" + "path="" + path + """ + ", maxSize=" + maxSize + ", acceptType=" + acceptType + "}"; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } public int getMaxSize() { return maxSize; } public void setMaxSize(int maxSize) { this.maxSize = maxSize; } public List getAcceptType() { return acceptType; } public void setAcceptType(List acceptType) { this.acceptType = acceptType; } }
UploadUtils
package com.hycx.common.util; import com.hycx.common.exception.ImageAcceptNotSupportException; import com.hycx.common.exception.ImageMaxSizeOverFlow; import com.hycx.common.property.UploadProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDate; import java.util.List; import java.util.UUID; /** * @author 陳少平 * @description * @create in 2018/2/14 20:42 */ @Component @EnableConfigurationProperties(UploadProperty.class) public class UploadUtil { //spring 中無法注入靜態(tài)變量,只能通過間接注入的方式,使用 @AutoWired直接報錯,使用Resource時 // 直接報找到了2個同樣的bean,但是我其實只有1個這樣的Bean。 @Resource(name = "uploadProperty") private UploadProperty tempUploadProperty; private static UploadProperty uploadProperty; // 在servlet中 會在構造函數(shù)之后執(zhí)行, 同樣可以實現(xiàn) InitializingBean 接口 @PostConstruct private void init(){ uploadProperty = tempUploadProperty; } /** * 圖片上傳,默認支持所有格式的圖片, 文件默認最大為 2MB * @param file * @return 圖片存儲路徑 */ public static String uploadImage(MultipartFile file){ return uploadImageByAcceptType(file,uploadProperty.getAcceptType(),uploadProperty.getMaxSize()); } /** * 圖片上傳,默認支持所有格式的圖片 * @param file * @param maxSize 文件最大多少,單位 mb * @return 圖片存儲路徑 */ public static String uploadImage(MultipartFile file,int maxSize){ return uploadImageByAcceptType(file,uploadProperty.getAcceptType(),uploadProperty.getMaxSize()); } /** * 上傳圖片(可限定文件類型) * @param file * @param acceptTypes "image/png image/jpeg image/jpg" * @param maxSize 文件最大為2MB * @return 圖片存儲路徑。 */ public static String uploadImageByAcceptType(MultipartFile file, ListacceptTypes,int maxSize){ String type = file.getContentType(); if(!acceptTypes.contains(type)){ throw new ImageAcceptNotSupportException(); } int size = (int) Math.ceil(file.getSize() / 1024 /1024); if(size > maxSize) { throw new ImageMaxSizeOverFlow(); } String originalFilename = file.getOriginalFilename(); String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); LocalDate now = LocalDate.now(); String year = now.getYear()+""; String month = now.getMonth().getValue()+""; String day = now.getDayOfMonth()+""; Path path = Paths.get(uploadProperty.getPath(), year, month, day); String filePath = path.toAbsolutePath().toString(); File fileDir = new File(filePath); fileDir.mkdirs(); String uuid = UUID.randomUUID().toString() + suffix; File realFile = new File(fileDir, uuid); try { IOUtils.copy(file.getInputStream(),new FileOutputStream(realFile)); } catch (IOException e) { e.printStackTrace(); } String tempPath = "/"+year+"/"+month+"/"+day+"/"+uuid; return tempPath; }
HttpUtils
package com.hycx.common.util; import org.springframework.util.StringUtils; import javax.servlet.http.HttpServletRequest; /** * @author 陳少平 * @description * @create in 2018/2/11 23:13 */ public class HttpUtil { /** * 獲取客戶端真實IP地址。需考慮客戶端是代理上網(wǎng) * @param request * @return 客戶端真實IP地址 */ public static String getClientIp(HttpServletRequest request){ if(StringUtils.isEmpty(request.getHeader("x-forwarded-for"))) { return request.getRemoteAddr(); } return request.getHeader("x-forwarded-for"); } /** * 獲取服務器地址 Http://localhost:8080/ 類似 * @param request * @return */ public static String serverBasePath(HttpServletRequest request) { return request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath(); } }
controller
@PostMapping("/avatar") public Object updateAvatar(String userName, @RequestParam("file") MultipartFile file, HttpServletRequest request) { JSONObject jsonObject = new JSONObject(); User user = userService.getUserByUserName(userName); if(Objects.isNull(user)) { jsonObject.put("code",HttpEnum.E_90003.getCode()); jsonObject.put("msg",HttpEnum.E_90003.getMsg()); return jsonObject; } String imagePath; try{ imagePath = UploadUtil.uploadImage(file); System.out.println("imagePath"+ imagePath); }catch (ImageAcceptNotSupportException ex) { jsonObject.put("code", HttpEnum.E_40002.getCode()); jsonObject.put("msg", HttpEnum.E_40002.getMsg()); return jsonObject; }catch (ImageMaxSizeOverFlow ex) { jsonObject.put("code", HttpEnum.E_40003.getCode()); jsonObject.put("msg", HttpEnum.E_40003.getMsg()); return jsonObject; } System.out.println(" basePath === "+HttpUtil.serverBasePath(request)); String msg = HttpUtil.serverBasePath(request) + imagePath; jsonObject.put("code", HttpEnum.OK.getCode()); jsonObject.put("msg", msg); return jsonObject; }
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/68492.html
摘要:有必要建一個資源服務器存放靜態(tài)資源。一些用戶級別的數(shù)據(jù)輕量可以考慮存儲在中。存儲的是值,可以通過來對和對象之間的轉(zhuǎn)換如果我們的數(shù)據(jù)是在后臺傳過去或者轉(zhuǎn)換而成的,在前臺上并沒有做什么改變的話。 移動商城項目總結 移動商城項目是我第二個做得比較大的項目,該項目系統(tǒng)來源于傳智Java168期,十天的視頻課程(想要視頻的同學關注我的公眾號就可以直接獲取了) 通過這次的項目又再次開闊了我的視野,...
摘要:前言由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 前言 由于寫的文章已經(jīng)是有點多了,為了自己和大家的檢索方便,于是我就做了這么一個博客導航。 由于更新比較頻繁,因此隔一段時間才會更新目錄導航哦~想要獲取最新原創(chuàng)的技術文章歡迎關注我的公眾號:Java3y Java3y文章目錄導航 Java基礎 泛型就這么簡單 注解就這么簡單 Druid數(shù)據(jù)庫連接池...
摘要:那我們就不用在每一個方法通過將數(shù)據(jù)傳到頁面。還能夠配置該參數(shù)是否是必須的。方法的返回值有種重定向轉(zhuǎn)發(fā)內(nèi)部就是將數(shù)據(jù)綁定到域?qū)ο笾械摹W⒔饽軌驅(qū)?shù)據(jù)綁定到中也就是中,如果經(jīng)常需要綁定到中的數(shù)據(jù),抽取成方法來使用這個注解還是不錯的。 前言 本文主要講解的知識點如下: 參數(shù)綁定 數(shù)據(jù)回顯 文件上傳 參數(shù)綁定 我們在Controller使用方法參數(shù)接收值,就是把web端的值給接收到Cont...
摘要:的官方文檔中將調(diào)用的入口稱作,而在的示例代碼中將其命名為,其實指的是同一個東西。其次是類至此,一個文件上傳的服務端接口已經(jīng)編寫完成。 前言 SpringBoot的官方文檔中關于Jersey的介紹并不是很全面: 27.3 JAX-RS and Jersey,SpringBoot-Sample項目里面也只有非常基礎的代碼,對于一些復雜的常用需求,這個文檔給不了任何幫助。 為了使用Jerse...
摘要:選擇該頁面綁定的標簽指定圖片上傳處理目錄注其中為了顯示為中文,標明了中文,同時需要下載語言包放到對應的文件夾下。 前言 我們常因為django的自帶admin后臺功能而選擇該框架,但也因為其自動生成的特殊性而在做出特別的更改的時候束手束腳,鑒于項目已經(jīng)采用了django,而后臺要求能夠直接上傳富文本內(nèi)容直接用于網(wǎng)頁顯示,定制性高,后來翻了目前較為知名的幾款富文本編輯框,覺得還是tiny...
閱讀 1334·2021-11-11 11:00
閱讀 3064·2021-09-24 09:47
閱讀 4989·2021-09-22 15:53
閱讀 971·2021-09-10 10:50
閱讀 3214·2021-09-01 11:40
閱讀 1174·2019-08-30 15:55
閱讀 480·2019-08-30 12:49
閱讀 1059·2019-08-29 17:12