SpringBoot+Vue实现阿里云OSS服务器签名直传并且返回回调数据

这篇具有很好参考价值的文章主要介绍了SpringBoot+Vue实现阿里云OSS服务器签名直传并且返回回调数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue

<template>
<el-upload
    class="upload-demo"
    :action="objectData.host"
    :before-upload="beforeUpload"
    accept=""
    :multiple="false"
    :on-exceed="handleExceed"
    :on-success="handleSuccess"
    :file-list="fileList"
    :on-error="handleError"
    :data="objectData"
    :show-file-list="false">
    <el-button size="small" type="primary">点击上传</el-button>
</el-upload>
</template>

<script>
export default {
  data() {
    return {
      fileList: [],
      objectData: {
          OSSAccessKeyId: '',
          policy: '',
          Signature: '',
          callback: '',
          key: '',
          host: '',
          dir: ''
      },
    };
  },
  methods: {
        beforeUpload(file) {
            const extensionLimits = {
                video: {extensions: ["mp4", "flv"], maxSize: 300},
                documents: {
                    extensions: ["doc", "docx", "xls", "xlsx", "ppt", "pptx", "pdf", "rar", "zip"],
                    maxSize: 30
                },
                images: {extensions: ["jpg", "png", "gif", "jpeg"], maxSize: 30},
                audio: {extensions: ["mp3"], maxSize: 30},
            };

            const ext = file.name.split(".").pop();
            const fileSize = file.size / 1024 / 1024;

            const showError = (errorMessage) => {
                this.$message.error(errorMessage);
                return false;
            };

            if (ext === "mp4" || ext === "flv") {
                if (fileSize > extensionLimits.video.maxSize) {
                    return showError("文件大小不能超过300MB!");
                }
            } else if (extensionLimits.documents.extensions.includes(ext)) {
                if (fileSize > extensionLimits.documents.maxSize) {
                    return showError("文件大小不能超过30MB!");
                }
            } else if (extensionLimits.images.extensions.includes(ext)) {
                if (fileSize > extensionLimits.images.maxSize) {
                    return showError("文件大小不能超过30MB!");
                }
            } else if (extensionLimits.audio.extensions.includes(ext)) {
                if (fileSize > extensionLimits.audio.maxSize) {
                    return showError("文件大小不能超过30MB!");
                }
            } else {
                return showError("上传文件只能是 doc、docx、xls、xlsx、ppt、pptx、pdf、rar、zip、jpg、png、gif、jpeg、mp4、flv、mp3 格式!");
            }
            this.FormLoading = true;
            let that = this
            //获取oss上传令牌
            return new Promise((resolve, reject) => {
                axios.get(JavaApiM + '/gt-web/resources/getSTSToken').then(res => {
                    const fileData = res.data.data
                    that.objectData.OSSAccessKeyId = fileData.accessId;
                    that.objectData.policy = fileData.policy;
                    that.objectData.Signature = fileData.signature;
                    that.objectData.callback = fileData.callback;
                    that.objectData.dir = fileData.dir;
                    that.objectData.host = fileData.host;
                    that.objectData.key = fileData.dir + '${filename}';
                    resolve(true);
                    console.log(fileData.domain + "/" + that.objectData.dir + file.name)
                })
                    .catch(res => {
                        reject(false)
                        console.log(res);
                    })
            })
        },
        handleExceed(files, fileList) {
        this.$message.warning(`当前限制选择 1 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
    		},
        handleSuccess(file) {
        let result = file.data;
        console.log(file);
        let info = {
            Ext: "." + result.path.split(".").pop(),
            Path: result.path,
            StatusCode: 1,
            fileSys: 2,
            name: result.path.split("/").pop()
        }
        console.log(info)
        this.fileList.push(info);
        this.FormLoading = false;
    },
        handleError(res, file) {
        this.FormLoading = false;
        this.$message.error('上传失败')
    		},
  }
};
</script>

<style>
</style>

java

    /**
     * 调用OSS接口获取STS临时访问凭证
     *
     * @return {@link ApiRest }
     * @author liuyanqiang
     * @since 2023/06/28 10:08
     **/
    @ApiOperation(value = "调用OSS接口获取STS临时访问凭证", notes = "调用OSS接口获取STS临时访问凭证")
    @RequestMapping(value = "/getSTSToken", method = RequestMethod.GET)
    public ApiRest getSTSToken() {
        return super.success(resourcesService.getSTSToken());
    }

    /**
     * 回调
     *
     * @param request 请求
     * @return {@link ApiRest }
     * @author liuyanqiang
     * @since 2023/07/03 10:46
     **/
    @ApiOperation(value = "调用OSS接口上传的回调函数", notes = "调用OSS接口上传的回调函数")
    @RequestMapping(value = "/callback", method = RequestMethod.POST)
    public ApiRest callback(HttpServletRequest request) {
        return super.success(resourcesService.callback(request));
    }
    /**
     * 调用OSS接口获取STS临时访问凭证
     *
     * @return {@link Map }<{@link String },{@link String }>
     * @author liuyanqiang
     * @since 2023/06/28 02:16
     **/
    Map<String,String> getSTSToken();

    /**
     * 回调
     *
     * @param request 请求
     * @return {@link Map }<{@link String },{@link String }>
     * @author liuyanqiang
     * @since 2023/07/06 02:55
     **/
    Map<String,String>  callback(HttpServletRequest request);
    @Value("${aliCloud.oss.access-key}")
    private String ACCESS_KEY;

    @Value("${aliCloud.oss.secret-key}")
    private String SECRET_KEY;

    @Value("${aliCloud.oss.bucket}")
    private String BUCKET;

    @Value("${aliCloud.oss.endpoint}")
    private String ENDPOINT;

    @Value("${aliCloud.oss.custom-domain}")
    private String CUSTOM_DOMAIN;

    @Value("${aliCloud.oss.file-dir}")
    private String FILE_DIR;

    @Value("${aliCloud.oss.callback-url}")
    private String CALLBACK_URL;



    /**
     * 调用OSS接口获取STS临时访问凭证
     *
     * @return {@link Map }<{@link String }, {@link String }>
     * @author liuyanqiang
     * @since 2023/06/28 02:16
     **/
    @Override
    public Map<String, String> getSTSToken() {
        return ossUtil.getSTSToken(CUSTOM_DOMAIN,BUCKET, ENDPOINT, ACCESS_KEY, SECRET_KEY,FILE_DIR,CALLBACK_URL);
    }

    /**
     * 回调
     *
     * @param request 请求
     * @return {@link Map }<{@link String }, {@link String }>
     * @author liuyanqiang
     * @since 2023/07/03 10:46
     **/
    @Override
    public Map<String, String> callback(HttpServletRequest request) {
        Map<String, String> respMap = new HashMap<>();
        String filename = request.getParameter("filename");
        String path = "https://".concat(CUSTOM_DOMAIN).concat("/").concat(filename);
        respMap.put("path", path);
        respMap.put("size", request.getParameter("size"));
        respMap.put("mimeType", request.getParameter("mimeType"));
        respMap.put("height", request.getParameter("height"));
        respMap.put("width", request.getParameter("width"));
        return respMap;
    }

/**
 * 阿里云 oss 上传工具类
 *
 * @author liuyanqiang
 * @version 1.0.0
 * @since 2023/04/19 06:36
 **/
@Slf4j
@Data
@Component
public class OSSUtil {
    /**
     * oss 工具客户端
     */
    private static OSSClient ossClient = null;

    /**
     * 获取STS临时访问凭证
     *
     * @param customDomain    自定义域
     * @param bucketName      bucket名称
     * @param endPoint        终点
     * @param accessKeyId     访问密钥id
     * @param accessKeySecret 访问密钥秘密
     * @param fileDir         文件dir
     * @param callbackUrl     回调url
     * @return {@link Map }<{@link String }, {@link String }>
     * @author liuyanqiang
     * @since 2023/07/03 10:45
     **/
    public static Map<String, String> getSTSToken(String customDomain,String bucketName, String endPoint, String accessKeyId, String accessKeySecret, String fileDir,String callbackUrl) {
        // 初始化oss
        initOSS(bucketName, endPoint, accessKeyId, accessKeySecret);
        Map<String, String> respMap = Maps.newHashMap();
        try {
            // 拼接文件路径
            fileDir = fileDir + DateUtil.format(new Date(), "yyyyMMdd") + "/" + System.currentTimeMillis()+"/";
            // 获取临时访问凭证
            long expireTime = 30;
            long expireEndTime = System.currentTimeMillis() + expireTime * 1000;
            Date expiration = new Date(expireEndTime);
            PolicyConditions policyConds = new PolicyConditions();
            policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, 0, 1048576000);
            policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, fileDir);
            String postPolicy = ossClient.generatePostPolicy(expiration, policyConds);
            byte[] binaryData = postPolicy.getBytes("utf-8");
            String policy = BinaryUtil.toBase64String(binaryData);
            String signature = ossClient.calculatePostSignature(postPolicy);
            // 设置回调参数
            JSONObject jasonCallback = new JSONObject();
            jasonCallback.put("callbackUrl", callbackUrl);
            jasonCallback.put("callbackBody",
                    "filename=${object}&size=${size}&mimeType=${mimeType}&height=${imageInfo.height}&width=${imageInfo.width}");
            jasonCallback.put("callbackBodyType", "application/x-www-form-urlencoded");
            String callbackData = BinaryUtil.toBase64String(jasonCallback.toString().getBytes());
            respMap.put("callback", callbackData);

            respMap.put("accessId",accessKeyId);
            respMap.put("policy",policy);
            respMap.put("signature",signature);
            respMap.put("dir",fileDir);
            respMap.put("host","https://" + bucketName + "." + endPoint);
            respMap.put("expire",String.valueOf(expireEndTime / 1000));
            respMap.put("domain","https://" + customDomain);
            log.info("获取临时访问凭证成功",respMap);
            return respMap;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientException e) {
            e.printStackTrace();
        }
        return respMap;
    }

    /**
     * 上传文件至阿里云 OSS
     *
     * @param file            待上传文件
     * @param customDomain    阿里云自定义域名
     * @param fileDir         阿里云OSS服务的访问域名路径
     * @param endPoint        阿里云OSS服务的访问域名
     * @param accessKeyId     访问密钥id
     * @param accessKeySecret 访问密钥串
     * @param bucketName      上传文件的存储空间名称
     * @return {@link String } 返回访问的全路径
     * @author liuyanqiang
     * @since 2023/04/19 06:32
     **/
    public static String uploadFileToOSS(MultipartFile file, String customDomain, String fileDir, String endPoint, String accessKeyId, String accessKeySecret, String bucketName) {
        // 初始化oss
        initOSS(bucketName, endPoint, accessKeyId, accessKeySecret);
        String visitUrl = null;
        try {
            // 获取文件名
            String orgName = file.getOriginalFilename();
            if (StringUtils.isEmpty(orgName)) {
                orgName = file.getName();
            }
            orgName = getFileName(orgName);
            //文件名称后缀使用

            // 拼接文件路径
            String fileRelName = fileDir + DateUtil.format(new Date(), "yyyyMMdd") + "/" + System.currentTimeMillis() + "_" + orgName;
            // 上传至oss
            PutObjectResult result = ossClient.putObject(bucketName, fileRelName, file.getInputStream());
            if (result != null) {
                log.info("------OSS文件上传成功------");
            }
            // 拼接访问路径
            visitUrl = "https://" + customDomain + "/" + fileRelName;
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            return null;
        }
        return visitUrl;
    }


    /**
     * 删除文件
     *
     * @param bucketName      上传文件的存储空间名称
     * @param fileName        要删除的文件名称
     * @param endPoint        阿里云OSS服务的访问域名
     * @param accessKeyId     访问密钥id
     * @param accessKeySecret 访问密钥串
     * @return {@link VoidResult }
     * @author liuyanqiang
     * @since 2023/04/19 06:30
     **/
    public static VoidResult deleteFileToOSS(String bucketName, String fileName, String endPoint, String accessKeyId, String accessKeySecret) {
        // 初始化oss
        initOSS(bucketName, endPoint, accessKeyId, accessKeySecret);
        return ossClient.deleteObject(bucketName, fileName);
    }


    /**
     * 初始化 oss 客户端
     *
     * @param bucketName      上传文件的存储空间名称
     * @param endpoint        阿里云OSS服务的访问域名
     * @param accessKeyId     访问密钥id
     * @param accessKeySecret 访问密钥串
     * @return {@link OSSClient }
     * @author liuyanqiang
     * @since 2023/04/19 18:23
     **/
    private static OSSClient initOSS(String bucketName, String endpoint, String accessKeyId, String accessKeySecret) {
        if (ossClient == null) {
            synchronized (OSSClient.class) {
                if (ossClient == null) {
                    ossClient = new OSSClient(endpoint, new DefaultCredentialProvider(accessKeyId, accessKeySecret), new ClientConfiguration());
                    // 设置权限(公开读)
                    ossClient.setBucketAcl(bucketName, CannedAccessControlList.PublicRead);
                }
            }
        }
        return ossClient;
    }


    /**
     * 判断文件名是否带盘符,重新处理
     *
     * @param fileName 文件名称
     * @return {@link String }
     * @author liuyanqiang
     * @since 2023/04/19 06:36
     **/
    public static String getFileName(String fileName) {
        //判断是否带有盘符信息
        // Check for Unix-style path
        int unixSep = fileName.lastIndexOf('/');
        // Check for Windows-style path
        int winSep = fileName.lastIndexOf('\\');
        // Cut off at latest possible point
        int pos = (winSep > unixSep ? winSep : unixSep);
        if (pos != -1) {
            // Any sort of path separator found...
            fileName = fileName.substring(pos + 1);
        }
        //替换上传文件名字的特殊字符
        fileName = fileName.replace("=", "").replace(",", "").replace("&", "").replace("#", "");
        return fileName;
    }
}

可参考官方文档:如何通过Java在服务端签名直传并设置上传回调_对象存储-阿里云帮助中心

SpringBoot+Vue实现阿里云OSS服务器签名直传并且返回回调数据,# 项目实战,vue.js,spring boot,服务器 文章来源地址https://www.toymoban.com/news/detail-539991.html

到了这里,关于SpringBoot+Vue实现阿里云OSS服务器签名直传并且返回回调数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【随笔】如何使用阿里云的OSS保存基础的服务器环境

    使用阿里云OSS创建一个存储仓库:bucket 在Linux上下载并安装阿里云的ossutil工具 链接: 阿里云安装ossutil工具手册 编写本地同步文件的脚本命令 使用宝塔的阿里云oss同步工具操作

    2024年02月11日
    浏览(33)
  • springboot整合https使用自签名证书实现浏览器和服务器之间的双向认证

    效果描述: 本地环境  两台以上电脑  可以实现安装客户端证书的电脑可以访问springboot启动项目,没有安装客户端证书的电脑无法访问springboot启动项目 1.操作:需要安装openssl工具 工具包:Win64OpenSSL_Light-3_3_0.exe 或者Win64OpenSSL_Light-3_3_0.msi  官网:[ Downloads ] - /source/index.html

    2024年04月28日
    浏览(36)
  • 如何快速搭建自己的阿里云服务器(宝塔)并且部署springboot+vue项目(全网最全)

    对于新手或者学生党来说,有时候就想租一个云服务器来玩玩或者练练手,duck不必花那么多钱去租个服务器。这些云服务厂商对学生和新手还是相当友好的。下面将教你如何快速搭建自己的阿里云服务器,完成云服务器的部署。 现在阿里云对于新用户来说,还是挺仗义的,

    2024年02月04日
    浏览(67)
  • 微信小程序 - 超详细 “纯前端“ 将文件上传到阿里云 OSS,最新阿里云 OSS 直传音视频、图片、word、excel、ppt、office 文档(全程无需后端,前端文件直传阿里云oss服务器)

    网上的教程乱七八糟却文件少代码(并且没注释),而且都已经很老了,对于新手来说真的无从下手。 本文站在新手小白的角度, 实现微信小程序开发中,“前端直传” 上传文件到阿里云oss对象存储的详细教程, 无需后端 (纯前端自己完成所有签名、上传),保证 100% 成

    2024年02月13日
    浏览(120)
  • Linux服务器上传文件到阿里云oss对象存储的两种方法ossutil、curl

    ossutil支持在Windows、Linux、macOS等系统中运行,您可以根据实际环境下载和安装合适的版本。 安装过程中,需要使用解压工具(unzip、7z)解压软件包,请提前安装其中的一个解压工具。 yum -y install unzip Linux系统一键安装 sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo b

    2024年02月13日
    浏览(44)
  • Java实现Fast DFS、服务器、OSS上传

    支持Fast DFS、服务器、OSS等上传方式 在实际的业务中,可以根据客户的需求设置不同的文件上传需求,支持普通服务器上传+分布式上传(Fast DFS)+云服务上传OSS(OSS) 为了方便演示使用,本项目使用的是前后端不分离的架构 前端:Jquery.uploadFile 后端:SpringBoot 前期准备:F

    2024年04月08日
    浏览(36)
  • Vue中实现图片上传,上传后的图片回显,存储图片到服务器 【使用对象存储OSS】

    前言 以下只提供一种思路,对新手可能不太友好。 这里将前端Vue上传的图片直接存储到服务器上, Alibaba Cloud OSS : 阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储

    2024年02月06日
    浏览(50)
  • 如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能?

    本文将详细介绍如何使用SpringBoot和Netty实现一个WebSocket服务器,并配合Vue前端实现聊天功能。 WebSocket是一种基于TCP的协议,它允许客户端和服务器之间进行双向通信,而不需要像HTTP那样进行请求和响应。Netty是一个Java网络编程框架,它提供了强大的异步事件驱动网络编程能

    2024年02月16日
    浏览(31)
  • idea 远程debug阿里云服务器springboot项目

    在实际的生产中不免会出现系统问题,有的在测试环境发现,有的在预发布环境发现,更有甚者在生产过程中出现造成事故。一般在我们发现问题时都会用debug来查找原因,但是有些时候我们本地环境由于某些原因根本不能复现线上问题。那么,这个时候我们可以考虑用远程

    2024年02月05日
    浏览(31)
  • 部署vue项目到阿里云服务器

    一般前端工程师只会使用npm run serve 在开发环境下验证,那么如何把npm run build 打出的包部署到服务器上进行上线呢?这篇文章就详细阐述这一流程。 1. 购买或试用阿里云服务器     作为新用户可以试用一个月阿里云服务器,阿里云官方网址如下:https://www.aliyun.com/?utm_conte

    2024年02月05日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包