成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Spring Boot項目中實現文件上傳功能的示例

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

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

一、配置OSS1. 導入SDK

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

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

導入完成后在 application.properties 配置文件中添加以下內容

# 節點域名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# 回調參數的請求地址aliyun.oss.callback=http://www.xxxxxx.com/api/aliyun/oss/callback

以上內容在開通服務后均可獲取到,請根據實際情況進行修改

3. 初始化

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

根據官方文檔的描述,需要初始化一個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項目中實現文件上傳功能的示例

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

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服務器上傳文件時要上傳Policy表單域,OSS服務器將對Policy表單域的內容進行驗證。關于 Post Policy 的詳細內容,請參考官方文檔:Post Policy

當文件上傳成功后,OSS服務器會向應用服務器發起回調請求,具體流程如下:

Spring Boot項目中實現文件上傳功能的示例

用戶只需要在發送給 OSS 的請求中攜帶相應的 Callback 參數,即能實現回調。

Callback 參數是由一段經過 base64 編碼的 JSON 字符串(字段)。構建 callback 參數的關鍵是指定請求回調的服務器 URL(callbackUrl)以及回調的內容(callbackBody)。

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

更詳細的內容請閱讀官方文檔:Callback

2. 功能實現

首先編寫 Post Policy 封裝對象OssPolicyResult

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

然后需自定義一個回調結果對象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;}

注:以上內容可根據實際需要進行修改

之后編寫 Service 接口及實現類

Service 接口:

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

Service 實現類:

@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;// 提交節點String action = 'http://' + BUCKET_NAME + '.' + ENDPOINT;// 上傳回調參數Callback callback = new Callback();// 指定請求回調的服務器URLcallback.setCallbackUrl(CALLBACK);//(可選)設置回調請求消息頭中Host的值,即您的服務器配置Host的值。// callback.setCallbackHost('yourCallbackHost');// 設置發起回調時請求body的值。callback.setCallbackBody('{'filename':${object}}');// 設置發起回調請求的Content-Type。callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);// 設置發起回調請求的自定義參數,由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());// 返回結果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上傳成功回調')@PostMapping('/aliyun/oss/callback')public Object callback(@RequestBody Map<String, Object> requestBody) {return ossService.callback(requestBody);}}

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

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
2024国产精品| 欧美三级网页| 精品福利av| 久久亚洲国产精品日日av夜夜| 中文字幕在线观看一区| 欧美日韩国产精品一区二区亚洲| 精品入口麻豆88视频| 国产九九视频一区二区三区| 欧美视频三区在线播放| 午夜影院久久久| 99精品久久| 亚洲精品你懂的| 99pao成人国产永久免费视频| 中文字幕中文字幕一区| 国内一区二区在线视频观看| 日本一区二区三区免费乱视频| www.欧美日韩国产在线| 精品国产一区二区三区久久影院| 成人精品一区二区三区四区 | 色综合天天综合在线视频| 久久人人97超碰com| 91网站在线播放| 国产三级精品视频| 欧美日韩国产不卡在线看| 国产精品乱码久久久久久| 伊人精品在线| 夜夜操天天操亚洲| 久久综合福利| 极品少妇xxxx精品少妇| 日韩视频免费观看高清完整版在线观看| 国产传媒一区在线| 久久亚洲综合av| 国产一区清纯| 亚洲一区二区在线观看视频| 亚洲一区免费看| 日欧美一区二区| 欧美日韩国产乱码电影| 国产91精品欧美| 久久久国产午夜精品| 黄色成人精品网站| 亚洲精品福利视频网站| 色94色欧美sute亚洲线路一ni | 26uuu另类欧美| 国产精品久久| 自拍视频在线观看一区二区| 精品1区2区3区4区| 午夜一区二区三区在线观看| 欧美女孩性生活视频| 成人精品视频一区二区三区尤物| 亚洲国产精品激情在线观看| 亚洲国产日韩欧美| 日本女人一区二区三区| 日韩小视频在线观看专区| 欧美在线一二三区| 亚洲视频免费在线观看| 色香蕉久久蜜桃| 从欧美一区二区三区| 亚洲欧洲精品天堂一级| 模特精品在线| 国产精品亚洲а∨天堂免在线| 国产欧美日韩三区| 亚洲一区二区三区四区中文| 国产一区美女在线| 国产精品无人区| 久久综合九色综合久99| 国产九色sp调教91| 国产精品女上位| 亚洲高清电影| 日韩电影免费在线| 精品日韩99亚洲| 亚洲国产日本| 久久se精品一区二区| 精品国产sm最大网站免费看| 99国产精品视频免费观看一公开| 蜜臀av在线播放一区二区三区| 欧美mv日韩mv| 亚洲作爱视频| 国产九色精品成人porny| 一色桃子久久精品亚洲| 一本大道av伊人久久综合| 国产成人在线看| 亚洲免费观看高清在线观看| 欧美精品在线视频| 亚洲精品乱码久久久久久蜜桃91| 国产一区日韩二区欧美三区| 成人欧美一区二区三区黑人麻豆 | 久久国产精品第一页| 国产色91在线| 久久久夜夜夜| 99re热视频精品| 丝袜美腿高跟呻吟高潮一区| 欧美色男人天堂| 在线精品在线| 国产·精品毛片| 亚洲第一av色| 久久久久久久久久久电影| 香蕉亚洲视频| 女人天堂亚洲aⅴ在线观看| 日日夜夜一区二区| 国产精品乱码一区二区三区软件 | 麻豆久久婷婷| 99re这里只有精品首页| 五月婷婷欧美视频| 国产色婷婷亚洲99精品小说| 久久另类ts人妖一区二区| 午夜久久美女| 看电视剧不卡顿的网站| 国产精品久久久久久久久久久免费看| 欧美色中文字幕| 亚洲裸体俱乐部裸体舞表演av| 国产成人夜色高潮福利影视| 一区二区三区精品视频| 久久久久久久免费视频了| 欧美综合色免费| 亚洲片区在线| 99综合电影在线视频| 麻豆高清免费国产一区| 中文字幕一区二区三| 欧美亚洲丝袜传媒另类| 好看的日韩av电影| 国产白丝网站精品污在线入口| 视频在线观看91| 亚洲视频在线观看三级| 久久久久综合网| 777亚洲妇女| 蘑菇福利视频一区播放| 欧美bbbxxxxx| 国产精品一区专区| 午夜精品福利一区二区蜜股av | 一区二区三区精品| 精品日韩欧美在线| 欧美日韩免费视频| 久久青青草综合| 国产传媒日韩欧美成人| 亚洲午夜国产一区99re久久| 亚洲国产精品成人久久综合一区| 欧美色精品在线视频| 国产日韩欧美亚洲一区| 午夜天堂精品久久久久| av一区二区不卡| 大胆亚洲人体视频| 国产不卡高清在线观看视频| 精油按摩中文字幕久久| 日产精品久久久久久久性色| 亚洲天堂免费看| 国产日韩欧美在线一区| 精品国产一区久久| 日韩一区二区三区高清免费看看| 欧美日韩一区二区在线观看| 91福利小视频| 久久国产精品毛片| 亚洲一区二区高清视频| 国产一区二区三区久久| 亚洲精品1234| 亚洲人体大胆视频| 在线免费高清一区二区三区| 国内成+人亚洲| 欧美一区免费| 欧美成熟视频| 欧美一区二区三区免费看| 粉嫩av一区二区三区| 国产精品亚洲成人| 国产河南妇女毛片精品久久久| 狠狠狠色丁香婷婷综合激情| 久久国产精品72免费观看| 日本在线不卡一区| 免费人成精品欧美精品| 麻豆精品在线视频| 麻豆成人91精品二区三区| 麻豆国产欧美日韩综合精品二区| 婷婷国产v国产偷v亚洲高清| 亚洲国产精品久久人人爱蜜臀| 亚洲一区二区三区免费视频| 亚洲综合在线第一页| 亚洲伦在线观看| 中文字幕的久久| 亚洲国产精品二十页| 国产欧美日韩在线视频| 国产精品麻豆久久久| 亚洲欧美一区二区久久| 亚洲精品久久久久久国产精华液| 亚洲精品ww久久久久久p站| 亚洲精品视频自拍| 一区二区三区四区激情| 一区二区三区日韩| 亚洲大片精品永久免费| 亚洲成人动漫在线免费观看| 亚洲自拍偷拍麻豆| 一区二区三区国产| 亚洲视频免费观看| 日韩一区中文字幕| 亚洲丝袜自拍清纯另类| 亚洲乱码国产乱码精品精的特点| 亚洲免费av高清| 亚洲一区免费在线观看| 亚洲国产日韩综合久久精品| 亚洲制服丝袜av| 午夜欧美一区二区三区在线播放 | 99久久99久久精品免费观看| 99精品欧美一区|