苍穹外卖---文件上传-阿里OSS

一:开通阿里云对象存储服务oss,创建bucket,获得密钥

二:在程序中集成上传文件功能

1.连接阿里云OSS对象存储服务器

声明一个配置属性的文件用于传入连接的参数

package com.sky.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "sky.alioss")
@Data
public class AliOssProperties {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

}

为了充分解耦,声明一个配置属性的类,从外部注入连接的属性值

  • @Component: 标注Spring管理的Bean,使用@Component注解在一个类上,表示将此类标记为Spring容器中的一个Bean
  • @data:Lombok注解用于生成对应的getter和setter方法
  • @ConfigurationProperties(prefix = "sky.alioss"):负责属性的批量注入

application.yml主配置文件中的配置信息:

spring:
  profiles:
用开发环境的配置文件
    active: dev

sky:
  alioss:
    endpoint: ${sky.alioss.endpoint}
    bucket-name: ${sky.alioss.bucket-name}
    access-key-id: ${sky.alioss.access-key-id}
    access-key-secret: ${sky.alioss.access-key-secret}

真正是信息配置在:开发环境中:application-dev.yml中 

通过配置多份不同环境的配置文件,再通过打包命令指定需要打包的内容之后进行区分打包

sky:
 
  alioss:
    endpoint: oss-cn-beijing.aliyuncs.com
    bucket-name:  waimaiguo
    access-key-id: ***************
    access-key-secret: *************

填写阿里云相关信息,用于连接阿里云

三:封装一个aliyunOssUtil工具类,用于上传文件并拼接返回上传的文件的路径

package com.sky.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;

@Data
@AllArgsConstructor
@Slf4j
public class AliOssUtil {

    private String endpoint;
    private String accessKeyId;
    private String accessKeySecret;
    private String bucketName;

    /**
     * 文件上传
     *
     * @param bytes
     * @param objectName
     * @return
     */
    public String upload(byte[] bytes, String objectName) {

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObject请求就是把图片上传到阿里云OSS上。
            ossClient.putObject(bucketName, objectName, new ByteArrayInputStream(bytes));
        } catch (OSSException oe) {
            System.out.println("Caught an OSSException, which means your request made it to OSS, "
                    + "but was rejected with an error response for some reason.");
            System.out.println("Error Message:" + oe.getErrorMessage());
            System.out.println("Error Code:" + oe.getErrorCode());
            System.out.println("Request ID:" + oe.getRequestId());
            System.out.println("Host ID:" + oe.getHostId());
        } catch (ClientException ce) {
            System.out.println("Caught an ClientException, which means the client encountered "
                    + "a serious internal problem while trying to communicate with OSS, "
                    + "such as not being able to access the network.");
            System.out.println("Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }

        //文件访问路径规则 https://BucketName.Endpoint/ObjectName
        StringBuilder stringBuilder = new StringBuilder("https://");
        stringBuilder
                .append(bucketName)
                .append(".")
                .append(endpoint)
                .append("/")
                .append(objectName);

        log.info("文件上传到:{}", stringBuilder.toString());

        return stringBuilder.toString();
    }
}

四:创建一个配置类用于生成工具类的bean交给spring容器管理

package com.sky.config;


import com.sky.properties.AliOssProperties;
import com.sky.utils.AliOssUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@Slf4j
public class OssConfiguration {

    @Bean
//需要把属性通过参数注入其中
    public AliOssUtil aliOssUtil(AliOssProperties aliOssProperties){
        log.info("创建阿里云上传文件对象:{}",aliOssProperties);
        return new AliOssUtil(aliOssProperties.getEndpoint(),
                aliOssProperties.getAccessKeyId(),
                aliOssProperties.getAccessKeySecret(),
                aliOssProperties.getBucketName());
    }
}

五:创建一个controller接受前端的请求


import com.sky.constant.MessageConstant;
import com.sky.result.Result;
import com.sky.utils.AliOssUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/admin/common")
@Api (tags = "通用接口")
@Slf4j
public class commonController {
    @Autowired
    private AliOssUtil aliOssUtil;
    @PostMapping("/upload")
    @ApiOperation("文件上传")
    public Result<String> upload(MultipartFile file){

        try {
            //接下来就是拼接文件名
            String originalFilename = file.getOriginalFilename();
            String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
            String objectString= UUID.randomUUID()+substring;
            //第一参数为:文件的输入流;第二个参数为上传文件的名称;
            String upload = aliOssUtil.upload(file.getBytes(), objectString);
            return Result.success(upload);
        } catch (IOException e) {
            System.out.println("文件上传异常:"+e);
        }

        return Result.error(MessageConstant.UPLOAD_FAILED);
    }

}
  • MultipartFile file:用于接收前端文件类型的参数
  • UUID类负责生成一个新的文件名称;防止文件名称重复
  • return Result.success(upload)
    最终返回给前端一个url,前端会请求这个路径回显图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/531476.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

three.js跟着教程实现VR效果(四)

参照教程&#xff1a;https://juejin.cn/post/6973865268426571784&#xff08;作者&#xff1a;大帅老猿&#xff09; 1.WebGD3D引擎 用three.js &#xff08;1&#xff09;使用立方体6面图 camera放到 立方体的中间 like “回” 让贴图向内翻转 &#xff08;2&#xff09;使…

每周一算法:树上差分

题目链接 闇の連鎖 题目描述 传说中的暗之连锁被人们称为Dark。 Dark是人类内心的黑暗的产物&#xff0c;古今中外的勇者们都试图打倒它。 经过研究&#xff0c;你发现Dark呈现无向图的结构&#xff0c;图中有 N N N个节点和两类边&#xff0c;一类边被称为主要边&#xf…

用Python编写GUI程序实现WebP文件批量转换为JPEG格式

在Python编程中&#xff0c;经常会遇到需要处理图片格式的情况。最近&#xff0c;我遇到了一个有趣的问题&#xff1a;如何通过编写一个GUI程序来实现将WebP格式的图片批量转换为JPEG格式&#xff1f;在这篇博客中&#xff0c;我将分享我使用Python、wxPython模块和Pillow库实现…

打开Visual Studio后出现Visual Assist报错弹窗

安装了新的VA插件后发现无论如何清理打开VS都会报这个旧版VA报错弹窗&#xff0c;修复VS、重装VA都解决不了 后来进到VS安装目录&#xff0c;删掉一个可疑文件后弹窗再也不出现了

光伏电站运维管理平台功能分析

光伏电站的建设发展&#xff0c;不仅可以满足人们日益增长的用电需求&#xff0c;同时对于减少能源资源消耗也有着十分重要的作用。但是光伏电站因为区域跨度大&#xff0c;分布广泛等原因在建设发展中导致了人员管理困难、运维工作落实不到等问题&#xff0c;直接影响光伏电站…

【随笔】Git 高级篇 -- 相对引用1 main^(十二)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

python用循环新建多个列表

​在Python编程中&#xff0c;我们经常需要创建多个列表来存储和管理数据。有时候&#xff0c;列表的数量是已知的&#xff0c;我们可以手动逐一创建&#xff1b;但更多时候&#xff0c;列表的数量是动态的&#xff0c;或者我们希望通过某种模式来批量生成列表。这时候&#xf…

对称加密学习

对称加密是一种加密技术&#xff0c;它使用相同的密钥进行数据的加密和解密操作。这种加密方法因其高效性和速度优势&#xff0c;在数据加密领域得到了广泛的应用。 下面是两篇文章&#xff1a; AES加密学习-CSDN博客 加密算法学习-CSDN博客 推荐关注加密专栏&#xff1a; …

HDLbits 刷题 --Exams/m2014 q4g

Implement the following circuit: 实现以下电路 module top_module (input in1,input in2,input in3,output out);assign out (~(in1^in2))^in3; endmodule运行结果&#xff1a; 分析&#xff1a; 同或&#xff1a; out ~(in1 ^ in2); 异或取反 异或&#xff1a; out in1…

【设计模式】笔记篇

目录标题 OO设计原则策略模式 - Strategy定义案例分析需求思路分析核心代码展示进一步优化UML 图 观察者模式 - Observe定义案例分析需求UML图内置的Java观察者模式核心代码 总结 装饰者模式 - Decorator定义案例分析需求UML图分析核心代码 总结 工厂模式 - Abstract Method/Fa…

素人小红书发布如何选择账号?

如何从众多账号中筛选出符合品牌或产品特性、具有高性价比和合作潜力的账号&#xff0c;成为了许多品牌和营销人士关注的焦点。素人小红书发布如何选择账号&#xff1f;接下来伯乐网络传媒就来给大家分享一下&#xff0c;希望能为你在小红书上进行账号选择提供一些有价值的参考…

docker部署postgresql数据库和整合springboot连接数据源

公司想要把部分sqlserver的旧服务迁移到PG数据库&#xff0c;先写一个示例的demo&#xff0c;需要用docker部署postgresql数据库和整合springboot连接数据源 安装 下载最新镜像 docker pull postgres创建并且启动容器 docker run -it --name postgres --restart always -e …

嵌入式应会的模电数电基础

AC/DC交直流 电压 欧姆定律 常见元器件 电阻器 并联电阻&#xff0c;增加通路&#xff0c;电阻更小&#xff0c;电流更大 串联电阻&#xff0c;电阻更大&#xff0c;电流越小 相同阻值的电阻&#xff0c;个头大小不同主要区别在功率容量、耐压能力和散热性能方面。 功率容量…

【STL】priority_queue的底层原理及其实现

文章目录 priority_queue的介绍库中priority_queue的使用什么叫仿函数&#xff1f; 模拟实现prioprity_queue类 priority_queue的介绍 解释以上内容 priority_queue&#xff08;优先级队列&#xff09;跟stack、queue一样&#xff0c;都是一种容器适配器&#xff0c;根据严格的…

SpringBoot中定时任务踩坑,@Scheduled重复执行问题排查(看完直接破防)

前言 今天再开发业务需求的过程中&#xff0c;需要用到定时任务&#xff0c;原本定的是每10分钟推送一次&#xff0c;可是当每次十分钟到的时候&#xff0c;定时任务就会推送多条&#xff01;但是非常奇怪的是&#xff0c;本地调试的时候不会有问题&#xff0c;只有当你部署到…

OpenCV | 图像读取与显示

OpenCV 对图像进行处理时&#xff0c;常用API如下&#xff1a; API描述cv.imread根据给定的磁盘路径加载对应的图像&#xff0c;默认使用BGR方式加载cv.imshow展示图像cv.imwrite将图像保存到磁盘中cv.waitKey暂停一段时间&#xff0c;接受键盘输出后&#xff0c;继续执行程序…

windows 之 redis非安装版,启动与初始化密码

1、下载redis 免安装版 2、解压后&#xff0c;启动服务 3、双击客服端 4、设置密码 config set requirepass root123456成功后&#xff0c;退出服务再次双击 5、登录 再次执行命名时已经没权限了 使用 auth password 登录 成功后&#xff0c;就可以了 auth root123456 …

arcgis使用面shp文件裁剪线shp文件报错

水系数据裁剪&#xff0c;输出为空&#xff1a; ArcGIS必会的几个工具的应用 --提取、分割、融合、裁剪&#xff08;矢&#xff09;、合并、追加、镶嵌、裁剪&#xff08;栅&#xff09;、重采样_arcgis分割-CSDN博客 下面的方法都不行&#xff1a; ArcGIS Clip&#xff08;裁…

JavaScript - 你遇到过哪几种Javascript的错误类型

难度级别:中级及以上 提问概率:50% 我们在开发Javascript代码的时候,经常一不小心就会遇到各种各样的异常,浏览器也会及时给出错误信息,那么一般会遇到哪几种异常情况呢,我们来看一下。 1 ReferenceError错误 ReferenceError几乎是最…

Ubuntu 20.04.06 PCL C++学习记录(二十四)

[TOC]PCL中点云分割模块的学习 学习背景 参考书籍&#xff1a;《点云库PCL从入门到精通》以及官方代码PCL官方代码链接,&#xff0c;PCL版本为1.10.0&#xff0c;CMake版本为3.16&#xff0c;可用点云下载地址 学习内容 如何使用已知系数的 SAC_Models 从点云中提取参数模型…