电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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

瀏覽:93日期: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
相關文章:
主站蜘蛛池模板: 物流公司电话|附近物流公司电话上门取货 | 继电器模组-IO端子台-plc连接线-省配线模组厂家-世麦德 | HV全空气系统_杭州暖通公司—杭州斯培尔冷暖设备有限公司 | 阜阳成人高考_阜阳成考报名时间_安徽省成人高考网 | 股指期货-期货开户-交易手续费佣金加1分-保证金低-期货公司排名靠前-万利信息开户 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 建筑消防设施检测系统检测箱-电梯**检测仪器箱-北京宇成伟业科技有限责任公司 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 儿童语言障碍训练-武汉优佳加感统文化发展有限公司 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 天一线缆邯郸有限公司_煤矿用电缆厂家_矿用光缆厂家_矿用控制电缆_矿用通信电缆-天一线缆邯郸有限公司 | 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 昆明挖掘机修理厂_挖掘机翻新再制造-昆明聚力工程机械维修有限公司 | 滤芯,过滤器,滤油机,贺德克滤芯,精密滤芯_新乡市宇清流体净化技术有限公司 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 超高频感应加热设备_高频感应电源厂家_CCD视觉检测设备_振动盘视觉检测设备_深圳雨滴科技-深圳市雨滴科技有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 全自动五线打端沾锡机,全自动裁线剥皮双头沾锡机,全自动尼龙扎带机-东莞市海文能机械设备有限公司 | 节流截止放空阀-不锈钢阀门-气动|电动截止阀-鸿华阀门有限公司 | 二氧化碳/活性炭投加系统,次氯酸钠发生器,紫外线消毒设备|广州新奥 | 防腐储罐_塑料储罐_PE储罐厂家_淄博富邦滚塑防腐设备科技有限公司 | 多功能干燥机,过滤洗涤干燥三合一设备-无锡市张华医药设备有限公司 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 河南正规膏药生产厂家-膏药贴牌-膏药代加工-修康药业集团官网 | 越南专线物流_东莞国际物流_东南亚专线物流_行通物流 | 水平筛厂家-三轴椭圆水平振动筛-泥沙震动筛设备_山东奥凯诺矿机 包装设计公司,产品包装设计|包装制作,包装盒定制厂家-汇包装【官方网站】 | 不锈钢反应釜,不锈钢反应釜厂家-价格-威海鑫泰化工机械有限公司 不干胶标签-不干胶贴纸-不干胶标签定制-不干胶标签印刷厂-弗雷曼纸业(苏州)有限公司 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 京马网,京马建站,网站定制,营销型网站建设,东莞建站,东莞网站建设-首页-京马网 | 电加热导热油炉-空气加热器-导热油加热器-翅片电加热管-科安达机械 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 棕刚玉_白刚玉_铝酸钙-锐石新材料| sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 精密模具-双色注塑模具加工-深圳铭洋宇通 | 硅胶管挤出机厂家_硅胶挤出机生产线_硅胶条挤出机_臣泽智能装备 贵州科比特-防雷公司厂家提供贵州防雷工程,防雷检测,防雷接地,防雷设备价格,防雷产品报价服务-贵州防雷检测公司 | 铝合金重力铸造_铝合金翻砂铸造_铝铸件厂家-东莞市铝得旺五金制品有限公司 | 磁力反应釜,高压釜,实验室反应釜,高温高压反应釜-威海自控反应釜有限公司 |