日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Boot項目中實現(xiàn)文件上傳功能的示例

瀏覽:167日期:2023-07-29 08:37:11

在實際項目中,文件上傳是很多項目必不可少的一個功能。那么在 Spring Boot 項目中又是如何來實現(xiàn)文件上傳功能的呢?一般來說,上傳的文件可以保存到項目根目錄下的某一文件夾中,但這樣做顯然是不太合適的。因此我們選擇將文件上傳到專門的文件服務(wù)器中。很多云計算廠商都提供文件存儲服務(wù)。這里我選擇的是阿里云的對象存儲(OSS)。

一、配置OSS1. 導(dǎo)入SDK

首先,你需要注冊阿里云的賬號并開通對象存儲服務(wù)。在準備工作完成之后,需要導(dǎo)入 JAVA 版本的 SDK,這里使用 maven 進行導(dǎo)入

<!-- 阿里云OSS對象存儲 --><dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.8.0</version></dependency>2. 修改配置文件

導(dǎo)入完成后在 application.properties 配置文件中添加以下內(nèi)容

# 節(jié)點域名aliyun.oss.endpoint=oss-cn-xxxxxxx.aliyuncs.com# 賬戶idaliyun.oss.accessKeyId=xxxxxxxxxxxxx# 賬戶密碼aliyun.oss.accessKeySecret=xxxxxxxxxxxxx# bucket名稱aliyun.oss.bucketName=xxxxxxxxxxx# 簽名過期時間aliyun.oss.policy.expire=300# 上傳文件的最大尺寸aliyun.oss.maxSize=10# 上傳地址的前綴aliyun.oss.dir.prefix=xxx# 回調(diào)參數(shù)的請求地址aliyun.oss.callback=http://www.xxxxxx.com/api/aliyun/oss/callback

以上內(nèi)容在開通服務(wù)后均可獲取到,請根據(jù)實際情況進行修改

3. 初始化

OSSClient是OSS的Java客戶端,用于管理存儲空間和文件等OSS資源。使用Java SDK發(fā)起OSS請求,您需要初始化一個OSSClient實例,并根據(jù)需要修改ClientConfiguration的默認配置項。

根據(jù)官方文檔的描述,需要初始化一個ossClient實例并將其注入到Spring容器中,因此可以編寫一個配置類OssConfig

@Configuration@PropertySource(value = {'classpath:application.properties'}, encoding = 'utf-8')public class OssConfig { @Value('${aliyun.oss.endpoint}') private String endpoint; @Value('${aliyun.oss.accessKeyId}') private String accessKeyId; @Value('${aliyun.oss.accessKeySecret}') private String secretAccessKey; @Bean public OSS ossClient(){ return new OSSClientBuilder().build(endpoint, accessKeyId, secretAccessKey); }}

更多詳細的配置,請參考官方文檔:初始化

二、文件上傳1. 流程分析

我們以典型的表單上傳為例,在使用對象存儲OSS后,表單上傳分為以下幾個流程:

Spring Boot項目中實現(xiàn)文件上傳功能的示例

注:Policy表單域用于驗證請求的合法性。例如可以指定上傳的大小,可以指定上傳的Object名稱等,上傳成功后客戶端跳轉(zhuǎn)到的URL,上傳成功后客戶端收到的狀態(tài)碼。

PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, DIR_PREFIX);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);// 將Policy字符串進行base64編碼String policy = BinaryUtil.toBase64String(binaryData);// 用OSS的AccessKeySecret對base64編碼后的Policy進行簽名String signature = ossClient.calculatePostSignature(postPolicy);

前端向OSS服務(wù)器上傳文件時要上傳Policy表單域,OSS服務(wù)器將對Policy表單域的內(nèi)容進行驗證。關(guān)于 Post Policy 的詳細內(nèi)容,請參考官方文檔:Post Policy

當文件上傳成功后,OSS服務(wù)器會向應(yīng)用服務(wù)器發(fā)起回調(diào)請求,具體流程如下:

Spring Boot項目中實現(xiàn)文件上傳功能的示例

用戶只需要在發(fā)送給 OSS 的請求中攜帶相應(yīng)的 Callback 參數(shù),即能實現(xiàn)回調(diào)。

Callback 參數(shù)是由一段經(jīng)過 base64 編碼的 JSON 字符串(字段)。構(gòu)建 callback 參數(shù)的關(guān)鍵是指定請求回調(diào)的服務(wù)器 URL(callbackUrl)以及回調(diào)的內(nèi)容(callbackBody)。

// 上傳回調(diào)參數(shù)Callback callback = new Callback();// 指定請求回調(diào)的服務(wù)器URLcallback.setCallbackUrl(CALLBACK);//(可選)設(shè)置回調(diào)請求消息頭中Host的值,即您的服務(wù)器配置Host的值。// callback.setCallbackHost('yourCallbackHost');// 設(shè)置發(fā)起回調(diào)時請求body的值。callback.setCallbackBody('{'filename':${object},'mineType':${mimeType}}');// 設(shè)置發(fā)起回調(diào)請求的Content-Type。callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);// 設(shè)置發(fā)起回調(diào)請求的自定義參數(shù),由Key和Value組成,Key必須以x:開始。// callback.addCallbackVar('x:dir', 'value');

更詳細的內(nèi)容請閱讀官方文檔:Callback

2. 功能實現(xiàn)

首先編寫 Post Policy 封裝對象OssPolicyResult

@Datapublic class OssPolicyResult {@ApiModelProperty('用戶id')private String accessKeyId;@ApiModelProperty('Post Policy經(jīng)過base64編碼過的字符串') private String policy;@ApiModelProperty('對policy簽名后的字符串') private String signature;// @ApiModelProperty('對象的鍵值')// private String key;@ApiModelProperty('上傳文件夾路徑前綴') private String dir;@ApiModelProperty('oss對外服務(wù)的訪問域名') private String host;@ApiModelProperty('上傳成功后的回調(diào)設(shè)置')private String callback;}

然后需自定義一個回調(diào)結(jié)果對象OssCallBackResult

@Datapublic class OssCallBackResult { @ApiModelProperty('文件的鏈接') private String url; @ApiModelProperty('文件名稱') private String filename; @ApiModelProperty('文件大小') private String size; @ApiModelProperty('文件的mimeType') private String mimeType; @ApiModelProperty('圖片文件的寬') private String width; @ApiModelProperty('圖片文件的高') private String height;}

注:以上內(nèi)容可根據(jù)實際需要進行修改

之后編寫 Service 接口及實現(xiàn)類

Service 接口:

public interface OssService { // 生成Post PolicyOssPolicyResult policy(); // 上傳成功后的回調(diào)OssCallBackResult callback(Map<String, Object> requestBody);}

Service 實現(xiàn)類:

@Slf4j@Service@PropertySource(value = {'classpath:application.properties'}, encoding = 'utf-8')public class OssServiceImpl implements OssService {@Value('${aliyun.oss.endpoint}')private String ENDPOINT;@Value('${aliyun.oss.accessKeyId}')private String ACCESS_KEY_ID;@Value('${aliyun.oss.accessKeySecret}')private String SECRET_ACCESS_KEY;@Value('${aliyun.oss.bucketName}')private String BUCKET_NAME;@Value('${aliyun.oss.policy.expire}')private int EXPIRE;@Value('${aliyun.oss.maxSize}')private int MAX_SIZE;@Value('${aliyun.oss.dir.prefix}')private String DIR_PREFIX;@Value('${aliyun.oss.callback}')private String CALLBACK;@Autowiredprivate OSS ossClient;@Overridepublic OssPolicyResult policy() {OssPolicyResult result = new OssPolicyResult();// 簽名有效期long expireEndTime = System.currentTimeMillis() + EXPIRE * 1000;Date expiration = new Date(expireEndTime);// 文件名稱// String filename = UUID.randomUUID().toString();// 文件大小long maxSize = MAX_SIZE * 1024 * 1024;// 提交節(jié)點String action = 'http://' + BUCKET_NAME + '.' + ENDPOINT;// 上傳回調(diào)參數(shù)Callback callback = new Callback();// 指定請求回調(diào)的服務(wù)器URLcallback.setCallbackUrl(CALLBACK);//(可選)設(shè)置回調(diào)請求消息頭中Host的值,即您的服務(wù)器配置Host的值。// callback.setCallbackHost('yourCallbackHost');// 設(shè)置發(fā)起回調(diào)時請求body的值。callback.setCallbackBody('{'filename':${object}}');// 設(shè)置發(fā)起回調(diào)請求的Content-Type。callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);// 設(shè)置發(fā)起回調(diào)請求的自定義參數(shù),由Key和Value組成,Key必須以x:開始。// callback.addCallbackVar('x:dir', 'value');try {PolicyConditions policyConds = new PolicyConditions();policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, maxSize);policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, DIR_PREFIX);String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8); // 將Policy字符串進行base64編碼String policy = BinaryUtil.toBase64String(binaryData); // 用OSS的AccessKeySecret對base64編碼后的Policy進行簽名String signature = ossClient.calculatePostSignature(postPolicy); // 將callback配置進行base64編碼String callbackData = BinaryUtil.toBase64String(OSSUtils.jsonizeCallback(callback).getBytes());// 返回結(jié)果result.setAccessKeyId(ACCESS_KEY_ID);result.setPolicy(policy);result.setSignature(signature);// result.setKey(filename);result.setDir(dir);result.setHost(action);result.setCallback(callbackData);} catch (Exception e) {log.error('簽名生成失敗', e);}return result;}@Overridepublic OssCallBackResult callback(Map<String, Object> requestBody) {OssCallBackResult ossCallbackResult = new OssCallBackResult();// 文件名String filename = requestBody.get('filename').toString();// 文件鏈接String url = 'https://' + BUCKET_NAME + '.' + ENDPOINT + '/' + DIR_PREFIX + '/' + filename;ossCallbackResult.setUrl(url);return ossCallbackResult;}}

添加 Controller 層:

@Api(tags = '阿里云對象存儲接口')@RequestMapping('/api')@RestControllerpublic class OssController {@Autowiredprivate OssService ossService;@ApiOperation(value = 'OSS上傳簽名生成')@GetMapping('/aliyun/oss/policy')public Object policy() {return ossService.policy();}@ApiOperation(value = 'OSS上傳成功回調(diào)')@PostMapping('/aliyun/oss/callback')public Object callback(@RequestBody Map<String, Object> requestBody) {return ossService.callback(requestBody);}}

到此這篇關(guān)于Spring Boot項目中實現(xiàn)文件上傳功能的示例的文章就介紹到這了,更多相關(guān)Spring Boot實現(xiàn)文件上傳內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
狂野欧美性猛交xxxx| 欧美 日韩 国产精品免费观看| 国模 一区 二区 三区| 99久久亚洲精品蜜臀| 亚洲特级毛片| 久久精品国产www456c0m| 一区三区视频| 蜜桃久久av一区| 热久久久久久久| 国产视频一区二区在线播放| 精品亚洲精品| 久久在线免费| 丝袜a∨在线一区二区三区不卡| 亚洲免费专区| 你懂的亚洲视频| 91精品一区二区三区综合在线爱| 亚洲香蕉网站| 亚洲天堂av资源在线观看| 国产图片一区| 丝袜美腿一区| 在线观看一区| 岛国av在线播放| 六月婷婷一区| 国产精品伊人| 欧美日韩国产传媒| 亚洲欧美日本国产| 成人国产精品一区二区免费麻豆| 欧美日韩一二三四| 亚洲精品欧美| 久草免费在线视频| 久久亚洲色图| 色一区二区三区四区| 好看的av在线不卡观看| 国产欧美高清视频在线| 国产精品久久久久久久久久10秀 | 欧美精品高清| 无码日韩精品一区二区免费| 97精品国产福利一区二区三区| 欧美特黄一级大片| 国产精品v亚洲精品v日韩精品| 成人av动漫在线观看| 国产欧美另类| 香蕉视频成人在线观看| 久久精品免视看国产成人| 欧美日韩精品在线一区| 国产精品亚洲欧美| 99日韩精品| 色婷婷综合网| 欧美亚洲三区| 免费黄网站欧美| 精品国产亚洲一区二区三区在线| 国产亚洲精品久久久久婷婷瑜伽| 精品精品久久| 日韩精品亚洲aⅴ在线影院| 精品国产a一区二区三区v免费| 视频一区欧美日韩| 美女av在线免费看| 国产精品九九| 日韩区一区二| 久久国产精品99国产| 视频福利一区| а√在线中文在线新版| 欧美天堂在线| 日韩精品第一| 亚洲精选成人| 国产精品亚洲一区二区三区在线观看| 国产亚洲字幕| 日本精品另类| 日本一区二区三区视频在线看| 狠狠爱成人网| 欧美日韩在线观看视频小说| 麻豆视频在线观看免费网站黄 | 视频一区中文字幕精品| 午夜欧美精品| 久久久久久久久丰满| 精品久久99| 美女精品一区二区| 久久成人高清| 精品日韩一区| 欧美精品中文| 日韩欧美激情| 日本不卡视频在线观看| 亚洲狼人精品一区二区三区| 国产亚洲精品v| 99成人在线| 老牛国产精品一区的观看方式| 亚洲婷婷免费| 免费欧美一区| 欧美日韩国产在线观看网站 | 国产超碰精品| 精品日韩视频| 在线一区视频观看| 欧美国产另类| 国产精品大片免费观看| 国产精品xxxav免费视频| 久久的色偷偷| 国产成人免费av一区二区午夜| 国产精品白丝av嫩草影院| 亚洲精品激情| 国产亚洲人成a在线v网站| 国产精品hd| 国产v日韩v欧美v| 久久人人97超碰国产公开结果| 亚洲国产专区校园欧美| 香蕉视频成人在线观看| 日韩毛片网站| 国产精品久久国产愉拍| 久久av免费看| 色黄视频在线观看| 亚洲午夜精品久久久久久app| 蜜桃视频欧美| 亚洲人成精品久久久| 欧美日韩网址| 国产精品蜜芽在线观看| 欧美日中文字幕| 伊人精品久久| 麻豆一区二区三| 久久激情中文| 亚州精品视频| 成人一区而且| 99国产精品久久久久久久成人热 | 久久久久久黄| 蜜桃91丨九色丨蝌蚪91桃色| 国产精品一级| 色88888久久久久久影院| 首页国产欧美日韩丝袜| 国产精品欧美一区二区三区不卡| 91亚洲人成网污www| 亚洲精品网址| 国产日本久久| 欧美日韩中文一区二区| 最新国产精品| 在线中文字幕播放| 丝袜国产日韩另类美女| 老司机精品视频网| 午夜久久中文| 亚欧成人精品| 成人羞羞视频播放网站| 日韩高清国产一区在线| 日本午夜大片a在线观看| 蜜桃av一区二区在线观看| 精品入口麻豆88视频| 爽好久久久欧美精品| 精品视频高潮| 中文字幕日韩亚洲| 天堂8中文在线最新版在线| 亚洲一区二区日韩| 日本精品不卡| 国产剧情一区| 香蕉成人久久| 国产黄色精品| 三级在线观看一区二区| 国产资源在线观看入口av| 亚洲一区二区av| 久久蜜桃资源一区二区老牛| 国产日产一区| 亚洲欧美日韩在线观看a三区| 精品一区二区三区的国产在线观看| 亚洲中午字幕| 日韩精品不卡一区二区| 国产欧美日韩一区二区三区四区 | 一区二区亚洲精品| 久久一区国产| 亚洲毛片在线免费| 国产99久久| 麻豆精品一区二区综合av| 日韩精品一级二级| 日本久久成人网| 久久精品资源| 日韩精彩视频在线观看| 亚洲国产一区二区在线观看| 色综合五月天| 国产探花一区| 亚洲精品视频一二三区| 中文字幕成在线观看| 国产精品永久| 欧美在线91| 亚洲天堂日韩在线| 一本一道久久a久久精品蜜桃| 亚洲国产福利| 国产一区丝袜| 国产欧美一区二区三区国产幕精品 | 久久国产精品免费精品3p| 亚洲免费黄色| 日韩精品一区二区三区免费观影 | 99精品视频精品精品视频| 国产精品一区二区美女视频免费看 | 久久精品99国产精品日本| 丝袜美腿成人在线| 不卡一区2区| 亚洲国产专区校园欧美| 特黄特色欧美大片| 激情国产在线| av资源中文在线| 精品国产乱码久久久久久樱花| 国产日韩欧美三级| 视频一区在线播放| 另类亚洲自拍| 亚洲午夜久久| 日韩精品高清不卡|