国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot對接阿里云OSS上傳文件以及回調(diào)(有坑)

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot對接阿里云OSS上傳文件以及回調(diào)(有坑)。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言

今天在對接阿里云OSS對象存儲(chǔ), 把這過程記錄下來

鏈接

阿里云的內(nèi)容很多,文檔是真的難找又難懂
本文主要是用的PostObject API 加上 Callback參數(shù)
PostObject -> https://help.aliyun.com/document_detail/31988.html?spm=a2c4g.31989.0.0
Callback -> https://help.aliyun.com/document_detail/31989.html?spm=a2c4g.31988.0.0

對接過程

  1. 前端向后端發(fā)送請求獲取簽名
  2. 后端與OSS服務(wù)器交互,返回前端簽名
  3. 前端拿到簽名,直接上傳到OSS服務(wù)器
  4. 上傳成功,OSS回調(diào)應(yīng)用服務(wù)器,應(yīng)用服務(wù)器給前端返回上傳的信息

相比應(yīng)用服務(wù)器直接上傳到OSS,大大減少了帶寬和應(yīng)用服務(wù)器的壓力,缺點(diǎn)就是相對麻煩一點(diǎn)

1. pom.xml

我們用的是SpringBoot,我們導(dǎo)入aliyun-oss-spring-boot-starter包,因?yàn)槲疫@個(gè)是 SpringCloud項(xiàng)目父項(xiàng)目管理了SpringCloud 和 SpringCloud Alibaba 、SpringBoot版本的,所以一開始我是沒有寫版本號的,結(jié)果一直爆紅,導(dǎo)不進(jìn)來,然后仔細(xì)一看,原來這是aliyun-oss-spring-boot-starter,注意這個(gè)boot-starter,我還以為是cloud系列的,然而哈哈,然后導(dǎo)入aliyun-spring-boot-dependencies,我在倉庫里面去找版本號,然而它也只有這一個(gè)1.0.0版本

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<!-- 阿里云OSS -->
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>aliyun-oss-spring-boot-starter</artifactId>
	</dependency>
</dependencies>
<dependencyManagement>
	<dependency>
		<groupId>com.alibaba.cloud</groupId>
		<artifactId>aliyun-spring-boot-dependencies</artifactId>
		<version>1.0.0</version>
		<type>pom</type>
		<scope>import</scope>
      </dependency>
</dependencyManagement>

2. application.yml

alibaba:
  cloud:
    # 阿里控制臺OSS子賬戶的信息 
    access-key: LTAI5tDZ51bANyHxYpwZzvpi
    secret-key: zPxHPuaZMTPzTPy0WF88vI99HHLOzO
    oss:
      # 深圳endpoint
      endpoint: oss-cn-shenzhen.aliyuncs.com
      # 認(rèn)證過期 單位秒
      expireTime: 1200
      # 儲(chǔ)存空間名字
      bucket: yues-oss

3. 核心代碼

package com.yues.gulimall.thirdparty.controller;

import com.aliyun.oss.OSS;
import com.aliyun.oss.common.utils.BinaryUtil;
import com.aliyun.oss.model.Callback;
import com.aliyun.oss.model.MatchMode;
import com.aliyun.oss.model.PolicyConditions;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.*;

@RestController
public class OssController {
    @Autowired
    private OSS ossClient;
    @Value("${alibaba.cloud.oss.endpoint}")
    private String endpoint;
    @Value("${alibaba.cloud.access-key}")
    private String accessId;
    @Value("${alibaba.cloud.oss.expireTime}")
    private long expireTime;
    @Value("${alibaba.cloud.oss.bucket}")
    private String bucket;

    /**
     * 回調(diào)
     * @param request request
     * @return Map
     */
    @RequestMapping("/ossCallback")
    public Map<String,String> ossCallback(HttpServletRequest request) {
        HashMap<String, String> result = new HashMap<>();
        String filename = request.getParameter("filename");
        Map<String, String[]> parameterMap = request.getParameterMap();
        parameterMap.forEach((item,value) -> {
            System.out.println(item);
            System.out.println(Arrays.toString(value));
        });
        filename = "https://".concat(bucket).concat(".").concat(endpoint).concat("/").concat(filename);
        result.put("url", filename);
        result.put("size", request.getParameter("size"));
        result.put("mimeType", request.getParameter("mimeType"));
        return result;
    }


    /**
     * 簽名
     * @return Map
     */
    @PostMapping("/getOssSecret")
    public Map<String,String> getOssSign() {
        // 填寫Host地址,格式為https://bucketname.endpoint。
        String host = "https://" + bucket + "."+ endpoint;
        // OSS會(huì)在文件上傳完成后,把文件上傳信息發(fā)送給應(yīng)用服務(wù)器。需要外網(wǎng)ip
        String callbackUrl = "https://23d4-1-196-175-217.ngrok-free.app/ossCallback";
        // 設(shè)置上傳到OSS文件的前綴,可置空此項(xiàng)。置空后,文件將上傳至Bucket的根目錄下。
        // 將日期作為上傳的文件夾目錄
        String format = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        String dir = format+"/";
        Map<String, String> respMap = null;
        try {
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            // 過期時(shí)間
            Date expiration = new Date(expireEndTime);
            // 上傳回調(diào)參數(shù)。
            Callback callback = new Callback();
            callback.setCallbackUrl(callbackUrl);
            // 設(shè)置回調(diào)請求消息頭中Host的值,即您的服務(wù)器配置Host的值。需要外網(wǎng)ip
             callback.setCallbackHost("23d4-1-196-175-217.ngrok-free.app");
            // 設(shè)置發(fā)起回調(diào)時(shí)請求body的值。
            callback.setCallbackBody("filename=${object}&size=${size}&mimeType=${mimeType}");
            // 設(shè)置發(fā)起回調(diào)請求的Content-Type。
            callback.setCalbackBodyType(Callback.CalbackBodyType.JSON);
            // 設(shè)置發(fā)起回調(diào)請求的自定義參數(shù),由Key和Value組成,Key必須以x:開始。
            callback.addCallbackVar("x:var1", "value1");
            callback.addCallbackVar("x:var2", "value2");
            // 序列化callback
            String callbackString = BinaryUtil.toBase64String(new ObjectMapper().writeValueAsString(callback).getBytes(StandardCharsets.UTF_8));

            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            // 添加目錄權(quán)限,返回的認(rèn)證信息只能在這個(gè)目錄下進(jìn)行操作
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);

            // 生成認(rèn)證 添加過期時(shí)間
            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes(StandardCharsets.UTF_8);
            // 轉(zhuǎn)為Base64
            String encodedPolicy = BinaryUtil.toBase64String(binaryData);
            String postSignature = ossClient.calculatePostSignature(postPolicy);

            respMap = new LinkedHashMap<>();
            respMap.put("OSSAccessKeyId", accessId);
            respMap.put("policy", encodedPolicy);
            respMap.put("Signature", postSignature);
            respMap.put("dir", dir);
            respMap.put("host", host);
            respMap.put("callback", callbackString);
            // 過期時(shí)間的時(shí)間戳
            respMap.put("expire", String.valueOf(expireEndTime / 1000));
        } catch (Exception e) {
            throw new RuntimeException("aliyun上傳文件獲取認(rèn)證信息失敗:" + e.getMessage());
        }
        return  respMap;
    }
}

4. postman 調(diào)用獲取簽名返回

{
    "OSSAccessKeyId": "LTAI5tDZ51bANyHxYpwZzvpi",
    "policy": "eyJleHBpcmF0aW9uIjoiMjAyMy0wNy0wM1QxNzoxNzo1MS44ODBaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCIyMDIzLTA3LTA0LyJdXX0=",
    "Signature": "yK5oF8Cj0ncR0ceuIMtXdMW1yco=",
    "dir": "2023-07-04/",
    "host": "https://yues-oss.oss-cn-shenzhen.aliyuncs.com",
    "callback": "eyJjYWxsYmFja1VybCI6Imh0dHBzOi8vMjNkNC0xLTE5Ni0xNzUtMjE3Lm5ncm9rLWZyZWUuYXBwL29zc0NhbGxiYWNrIiwiY2FsbGJhY2tIb3N0IjoiMjNkNC0xLTE5Ni0xNzUtMjE3Lm5ncm9rLWZyZWUuYXBwIiwiY2FsbGJhY2tCb2R5IjoiZmlsZW5hbWU9JHtvYmplY3R9JnNpemU9JHtzaXplfSZtaW1lVHlwZT0ke21pbWVUeXBlfSIsImNhbGJhY2tCb2R5VHlwZSI6IkpTT04iLCJjYWxsYmFja1ZhciI6eyJ4OnZhcjIiOiJ2YWx1ZTIiLCJ4OnZhcjEiOiJ2YWx1ZTEifX0=",
    "expire": "1688404671"
}

5. 前端上傳到OSS

拿到第四步的JSON后,請求JSON中的host,key = dir + 文件名.后綴,然后按照下圖方式請求
SpringBoot對接阿里云OSS上傳文件以及回調(diào)(有坑)
注意文章來源地址http://www.zghlxwxcb.cn/news/detail-516680.html

  1. Content-Type要為multipart/form-data;
  2. file 必須在表單數(shù)據(jù)中最后一個(gè)
  3. 上傳的file大小不能超過5 GB
  4. 不知道為什么 我這邊postman上傳的file,它的文件名字不能是中文的,不然就會(huì)返回405,這個(gè)問題調(diào)試我半天,我覺得應(yīng)該是字符編碼哪里要設(shè)置一下,沒有具體研究下去了

到了這里,關(guān)于SpringBoot對接阿里云OSS上傳文件以及回調(diào)(有坑)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot+Vue實(shí)現(xiàn)阿里云OSS服務(wù)器簽名直傳并且返回回調(diào)數(shù)據(jù)

    SpringBoot+Vue實(shí)現(xiàn)阿里云OSS服務(wù)器簽名直傳并且返回回調(diào)數(shù)據(jù)

    vue java 可參考官方文檔:如何通過Java在服務(wù)端簽名直傳并設(shè)置上傳回調(diào)_對象存儲(chǔ)-阿里云幫助中心 ?

    2024年02月13日
    瀏覽(26)
  • SpringBoot3 + uniapp 對接 阿里云0SS 實(shí)現(xiàn)上傳圖片視頻到 0SS 以及 0SS 里刪除圖片視頻的操作(最新)

    SpringBoot3 + uniapp 對接 阿里云0SS 實(shí)現(xiàn)上傳圖片視頻到 0SS 以及 0SS 里刪除圖片視頻的操作(最新)

    UpLoadFile.vue deleteOssFile.js http.js FileUploadController.java AliOssUtil.java

    2024年04月14日
    瀏覽(29)
  • 如何使用阿里云OSS進(jìn)行前端直傳以及分片上傳

    在使用阿里云OSS進(jìn)行前端直傳時(shí),首先我們需要去阿里云官網(wǎng)注冊自己的存儲(chǔ)桶,然后申請相關(guān)的accessKeyId和accessKeySecret,然后新建一個(gè)桶,為這個(gè)桶命名以及選擇對應(yīng)的地區(qū)。 然后可以根據(jù)自己的業(yè)務(wù),封裝對應(yīng)的組件,以下是根據(jù)我自己的項(xiàng)目,所封裝的上傳組件,所用

    2024年02月21日
    瀏覽(22)
  • 阿里云OSS文件上傳

    阿里云OSS文件上傳

    需求分析:實(shí)現(xiàn)文件上傳與下載 ,與SprinCloud Alibaba整合 步驟一:注冊帳號 阿里云登錄 - 歡迎登錄阿里云,安全穩(wěn)定的云計(jì)算服務(wù)平臺 ?第二步:創(chuàng)建Bucket ?第三步,創(chuàng)建Accesskey? 注意:創(chuàng)建時(shí)候一定記得復(fù)制帳號密碼,密碼只在創(chuàng)建成功后顯示一次! 第四步:安裝對象存儲(chǔ)

    2024年01月24日
    瀏覽(25)
  • 使用SpringBoot將圖片上傳至阿里云OSS

    使用SpringBoot將圖片上傳至阿里云OSS

    1. 什么是OSS? 官方的解釋是這樣的:阿里云對象存儲(chǔ)OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),提供99.9999999999%(12個(gè)9)的數(shù)據(jù)持久性,99.995%的數(shù)據(jù)可用性。 官網(wǎng):對象存儲(chǔ)OSS 2. 為什么要使用OSS? 作者認(rèn)為主要是方便項(xiàng)目上線后的文件業(yè)務(wù)的處

    2024年02月06日
    瀏覽(25)
  • 阿里云對象存儲(chǔ)OSS文件上傳

    阿里云對象存儲(chǔ)OSS文件上傳

    阿里云oss地址: 對象存儲(chǔ)OSS_云存儲(chǔ)服務(wù)_企業(yè)數(shù)據(jù)管理_存儲(chǔ)-阿里云 阿里云對象存儲(chǔ)OSS是一款海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),提供12個(gè)9的數(shù)據(jù)持久性,99.995%的數(shù)據(jù)可用性和多種存儲(chǔ)類型,適用于數(shù)據(jù)湖存儲(chǔ),數(shù)據(jù)遷移,企業(yè)數(shù)據(jù)管理,數(shù)據(jù)處理等多種場景,可對

    2024年02月12日
    瀏覽(24)
  • Golang操作阿里云OSS上傳文件

    Golang操作阿里云OSS上傳文件

    為什么要使用OSS?應(yīng)用場景是什么? 最近在開發(fā)考試系統(tǒng),里面需要上傳課件,課件包括pdf,map等等各種類型的文件,這些文件不能像圖片一樣,直接上傳到項(xiàng)目目錄下面,需要單獨(dú)存放,阿里云就提供了存儲(chǔ)方式,然后OSS是其中的一種,可以用來存儲(chǔ)一些文件。 我們需要

    2024年02月02日
    瀏覽(39)
  • SpringCloud整合阿里云OSS實(shí)現(xiàn)文件上傳

    SpringCloud整合阿里云OSS實(shí)現(xiàn)文件上傳

    阿里云OSS官網(wǎng):OSS管理控制臺 (aliyun.com) 什么是對象存儲(chǔ)OSS 阿里云對象存儲(chǔ)OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存儲(chǔ)服務(wù),可提供99.9999999999%(12個(gè)9)的數(shù)據(jù)持久性,99.995%的數(shù)據(jù)可用性。多種存儲(chǔ)類型供選擇,全面優(yōu)化存儲(chǔ)成本。 OSS具有與平臺無

    2023年04月13日
    瀏覽(46)
  • 微信小程序文件直接上傳阿里云OSS

    第一步 配置Bucket跨域訪問 第二步 微信小程序配置域名白名單 以上兩步,請參考阿里云官網(wǎng), 如何在微信小程序環(huán)境下將文件上傳到OSS_對象存儲(chǔ) OSS-阿里云 https://help.aliyun.com/document_detail/92883.html 安裝依賴 wx-oss-upload 然后創(chuàng)建自己的上傳方法,引用 wx-oss-upload ?然后在選取文

    2024年02月11日
    瀏覽(23)
  • node.js - 上傳文件至阿里云oss

    deploy.js

    2024年02月08日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包