阿里云OSS对象存储服务

准备工作

1、在service模块新建子模块service_oss

2、引入pom.xml文件中引入oss服务依赖

 <dependencies>
<!--aliyunOSS-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
</dependency> <!-- 日期工具栏依赖 -->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency> </dependencies>

后台上传开发

1、在配置文件application.properties中配置阿里云

#服务端口
server.port=8003
#服务名
spring.application.name=service-oss #环境设置:dev、test、prod
spring.profiles.active=dev # nacos服务地址
#spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 #阿里云 OSS
#不同的服务器,地址不同
aliyun.oss.file.endpoint=oss-cn-beijing.aliyuncs.com
aliyun.oss.file.keyid=LTAI4GFzTBo3LTCyo1wLA1Ys
aliyun.oss.file.keysecret=EAcieIxjX84Yr3TCvXX3LG95JNSWnS
#bucket可以在控制台创建,也可以使用java代码创建
aliyun.oss.file.bucketname=edu-bi

2、启动类配置

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@ComponentScan(basePackages = {"com.birdy"})
public class OssApplication {
public static void main(String[] args) {
SpringApplication.run(OssApplication.class);
}
}

exclude = DataSourceAutoConfiguration.class: 排除数据源配置

因为oss模块不需要操作数据库,所以在application.properties配置文件中没有配置数据库,但springboot是自动加载配置,没有找到数据库配置,启动时会报错

Failed to configure a DataSource:' url’ attribute is not specif: 未能配置DataSource:“URL”属性不是指定:

Reason: Failed to determine a suitable driver class 原因:未能确定合适的驱动程序类

3、定义工具类获取配置中的数据

@Component
public class ConstantPropertiesUtils implements InitializingBean { //读取配置文件内容
@Value("${aliyun.oss.file.endpoint}")
private String endPoint; @Value("${aliyun.oss.file.keyid}")
private String keyId; @Value("${aliyun.oss.file.keysecret}")
private String keySecret; @Value("${aliyun.oss.file.bucketname}")
private String bucketName; //定义公开静态常量
public static String END_POINT;
public static String ACCESS_KEY_ID;
public static String ACCESS_KEY_SECRET;
public static String BUCKET_NAME; /*
属性初始化完成后执行该方法
*/
@Override
public void afterPropertiesSet() throws Exception {
END_POINT = endPoint;
ACCESS_KEY_ID = keyId;
ACCESS_KEY_SECRET = keySecret;
BUCKET_NAME = bucketName;
}
}

由于私有属性外界无法访问,所以要定义公共静态常量并将私有属性值赋给这些常量,才能被其他类获取

4、创建服务层接口和实现类

//service层接口
public interface OssService {
String uploadFileAvatar(MultipartFile file);
}
package com.birdy.oss.service.impl;

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.birdy.oss.service.OssService;
import com.birdy.oss.utils.ConstantPropertiesUtils;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import java.io.InputStream;
import java.util.UUID; //实现类
@Service
public class OssServiceImpl implements OssService {
//上传头像到oss
@Override
public String uploadFileAvatar(MultipartFile file) {
// 工具类获取值
String endPoint = ConstantPropertiesUtils.END_POINT;
String accessKeyId = ConstantPropertiesUtils.ACCESS_KEY_ID;
String accessKeySecret = ConstantPropertiesUtils.ACCESS_KEY_SECRET;
String bucketName = ConstantPropertiesUtils.BUCKET_NAME; try {
// 1、创建OSS实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret); // 2、获取上传文件输入流
InputStream inputStream = file.getInputStream(); // 3、获取文件名称
String fileName = file.getOriginalFilename(); //在文件名称里面添加随机值,避免文件重名,同时替换掉文件名中的"-"
String uuid = UUID.randomUUID().toString().replaceAll("-","");
// yuy76t5rew01.jpg
fileName = uuid+fileName; //把文件按照日期进行分类
String datePath = new DateTime().toString("yyyy/MM/dd");
// 2019/11/12/ewtqr313401.jpg
fileName = datePath+"/"+fileName; /*
4、调用oss方法实现上传
第一个参数 Bucket名称
第二个参数 上传到oss文件路径和文件名称 aa/bb/1.jpg
第三个参数 上传文件输入流
*/
ossClient.putObject(bucketName , fileName , inputStream); // 5、关闭OSSClient。
ossClient.shutdown(); //返回上传之后文件路径
//需要手动拼接上传到阿里云oss的路径
// https://edu-birdy.oss-cn-beijing.aliyuncs.com/gitlab头像.jpg
String url = "https://"+bucketName+"."+endPoint+"/"+fileName;
return url;
}catch(Exception e) {
e.printStackTrace();
return null;
}
}
}

5、控制层调用

@RestController
@RequestMapping("/eduoss/fileoss")
public class OssController {
@Autowired(required = false)
private OssService ossService;
//上传头像的方法
@PostMapping
public Result uploadOssFile(MultipartFile file) {
//获取上传文件 MultipartFile
//返回上传到oss的路径
String url = ossService.uploadFileAvatar(file);
return Result.ok().data("url",url);
}
}

前端整合上传头像

准备

config文件夹下的dev.env.js文件中添加nginx代理端口

 'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env') module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
// BASE_API: '"https://easy-mock.com/mock/5950a2419adc231f356a6636/vue-admin"',
BASE_API: '"http://localhost:9001"',
OSS_PATH: '"https://guli-file.oss-cn-beijing.aliyuncs.com"'
})

1、导入组件模板

在组件模板中导入上传头像组件ImageCropperPanThumbvue-admin-template后台管理模板精简版没有该组件,完整版有,本次使用的是精简版,需要从完成版拷过来)

2、引入模板组件

<script>
import ImageCropper from '@/components/ImageCropper'
import PanThumb from '@/components/PanThumb' export default {
components: {ImageCropper, PanThumb}
}
</script>

3、使用

<el-form-item label="讲师头像">

    <!-- 使用PanThumb组件,头衔缩略图 -->
<pan-thumb :image="teacher.avatar"/>
<!-- 文件上传按钮 -->
<el-button type="primary" icon="el-icon-upload" @click="imagecropperShow=true">更换头像
</el-button> <!--
v-show:是否显示上传组件
:key:类似于id,如果一个页面多个图片上传控件,可以做区分
:url:后台上传的url地址
@close:关闭上传组件
@crop-upload-success:上传成功后的回调
<input type="file" name="file"/>
-->
<image-cropper
v-show="imagecropperShow"
:width="300"
:height="300"
:key="imagecropperKey"
:url="BASE_API+'/eduoss/fileoss'"
field="file"
@close="close"
@crop-upload-success="cropSuccess"/>
</el-form-item> <el-form-item>
<el-button :disabled="saveBtnDisabled" type="primary" @click="saveOrUpdate">保存</el-button>
</el-form-item>
export default {
components: {ImageCropper, PanThumb},
data() {
return {
teacher:{
name: '',
sort: 0,
level: 1,
career: '',
intro: '',
avatar: ''
}, //上传弹框组件是否显示
imagecropperShow:false,
imagecropperKey:0,//上传组件key值
BASE_API:process.env.BASE_API, //获取dev.env.js里面地址
saveBtnDisabled:false // 保存按钮是否禁用,
}
},
methods:{
close() { //关闭上传弹框的方法
this.imagecropperShow=false
//上传组件初始化
this.imagecropperKey = this.imag,cropperKey+1
},
//上传成功方法
cropSuccess(data) {
this.imagecropperShow=false
//上传之后接口返回图片地址
this.teacher.avatar = data.url
this.imagecropperKey = this.imagecropperKey+1
}
}

谷粒 | 10 | 阿里云OSS存储对象服务的更多相关文章

  1. Laravel 使用阿里云 oss 存储对象

    一.下载安装 composer require jacobcyl/ali-oss-storage 二.注册服务提供者 在config/app.php的providers下添加: //阿里云OSS对象存 ...

  2. 前端(react)上传到阿里云OSS存储 实例

    需求背景 由于现有的后台管理系统,上传的视频越来越大,加上上传视频较慢,后端小哥提出直接从前端上传视频或者其他文件到阿里云OSS存储. 阿里云OSS 阿里云OSS文档介绍,这里不做过多赘述 安装 原本 ...

  3. php将图片存储在阿里云oss存储上

    创建两个方法 1.上传方法 use OSS\OssClient; use think\Config; use OSS\Core\OssException; /** * 存储文件 * * @param ...

  4. 备份MySQL数据库并上传到阿里云OSS存储

    1. 环境配置 要将本地文件上传到阿里云oss中, 必须使用阿里云提供的工具 ossutil, 有32位,也有64位的, Linux和Windows都有.具体可以到阿里云官网下载 官网及文档: htt ...

  5. 云-阿里云-OSS:对象存储 OSS

    ylbtech-云-阿里云-OSS:对象存储 OSS 对象存储服务(Object Storage Service,OSS)是一种海量.安全.低成本.高可靠的云存储服务,适合存放任意类型的文件.容量和处 ...

  6. 阿里云OSS存储开发(一)

    Step 1. 初始化一个OSSClient OSSClient是与OSS服务交互的客户端,SDK的OSS操作都是通过OSSClient完成的. 下面代码新建了一个OSSClient: using A ...

  7. 阿里云OSS存储

    1.accessKeyId 与 accessKeySecret 是由系统分配给用户的,称为ID对,用于标识用户,为访问OSS做签名验证. 2.Bucket是OSS上的命名空间,相当于数据的容器,可以存 ...

  8. Java项目接入阿里云OSS存储

    需求背景 目前公司内部项目所支持的文件云存储方式还是公司内部项目组提供的方案,但在时间的考验之下,弊端显现,尤其是灾备切换过程中需要切换访问地址,这种操作不方便,更可能因为中间过程的失误导致资源不可用 ...

  9. 阿里云OSS存储前端API上传(签名上传)

    一.创建用户 在阿里云创建用户https://ram.console.aliyun.com/users,并勾选Open API 保存好信息,很重要,返回后就再也找不到了 新增授权(这里视个人情况,需要 ...

随机推荐

  1. php CURL 发送http请求 GET POST

    * CURL http://www.php.net/manual/en/book.curl.php http://jp2.php.net/manual/en/function.curl-setopt. ...

  2. django 模版-标签-视图-csrf-token-模版继承-HTML过滤器

    """ ******模版****** --定义模版-- **变量** 视图传递给模版的数据 注意1:要遵守标识符规则 语法:{{var(即变量)}} 如果使用的变量不存在 ...

  3. P3307-[SDOI2013]项链【Burnside引理,莫比乌斯反演,特征方程】

    正题 题目链接:https://www.luogu.com.cn/problem/P3307 题目大意 \(n\)个珠子的一个环形项链,每个珠子有三个\(1\sim k\)的整数. 两个珠子不同当且仅 ...

  4. P1251-餐巾计划问题【费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P1251 题目大意 \(N\)天,第\(i\)天需要\(a_i\)个餐巾. 每个餐巾价格为\(p\),使用完后有两种 ...

  5. TypeScript 条件类型精读与实践

    在大多数程序中,我们必须根据输入做出决策.TypeScript 也不例外,使用条件类型可以描述输入类型与输出类型之间的关系. 本文同步首发在个人博客中,欢迎订阅.交流. 用于条件判断时的 extend ...

  6. github注册教程最新版(十年程序员保姆级教程)

    您可以在墨抒颖的网站体验本文章的纯净版 准备 拥有一个可以接受信息的邮箱即可 开始 点击github官网github step1.进入注册页面 点击Sign Up进入注册流程 step2.输入邮箱 这 ...

  7. 屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze

    最近想做一个脚本小工具,方便写一些操作说明文档,它的功能很简单,就是把脚本打开之后,鼠标进行操作点击时,会在点击后进行截图,并在图上标记出点击的位置,有点类似于录屏软件的图片版,这样的话,如果要想用文 ...

  8. [USACO10NOV]Buying Feed G

    part 1 暴力 不难发现有一个 $\mathcal O(K^2n)$ 的基础 dp: $$f_{i,j+l}=\min(f_{i,j+l},f_{i-1,j}+(x_i-x_{i-1})jj+c_ ...

  9. Netty 了解

    1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework for rapid develop ...

  10. NOIP模拟80

    学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...