0-前言

  项目中,文件服务必不可少,常用的有各云服务商的OSS服务(如阿里云OSS,腾讯云OSS,七牛云)、自建(fastDFS、minio);

  推荐:如果用云服务的话,阿里云OSS很方便,如果自建的话,minio无疑是首选;

  这里我们来简单介绍阿里云OSS的使用,minio我们后面介绍;

1-实现

1-0、开通OSS,并获取到相关配置参数供程序使用

  首先开通阿里云OSS,创建bucket、创建AccessKey,几分钟就搞定了,不会的具体百度下;

1-1、添加依赖

        <!-- 1、集成阿里云OSS -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.6.0</version>
</dependency>

1-2、添加配置

# 阿里云存储参数配置
aliyun:
oss:
endpoint: oss-cn-beijing.aliyuncs.com
accessKeyId: XXX
accessKeySecret: xxx
bucketName: ansonfile

1-3、添加工具类(里面细节可以自己相应修改完善)

package com.example.oss.utils;

import com.aliyun.oss.OSSClient;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*; /**
* 描述: 阿里云OSS工具类
* 版权: Copyright (c) 2020
* 公司: XXX
* 作者: yanghj
* 版本: 4.0
* 创建日期: 2020/9/16 11:38
*/
@Component
public class OssUtil
{
//------------------变量----------
protected static final Logger log = LoggerFactory.getLogger(OssUtil.class); @Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName; //文件存储目录
private String filedir = "clouFile/"; //-----------------对外功能----------------
/**
* 1、单个文件上传
* @param file
* @return 返回完整URL地址
*/
public String uploadFile(MultipartFile file)
{
String fileUrl = uploadImg2Oss(file);
String str = getFileUrl(fileUrl);
return str.trim();
}
/**
* 1、单个文件上传(指定文件名(带后缀))
* @param file
* @return 返回完整URL地址
*/
public String uploadFile(MultipartFile file,String fileName)
{
try
{
InputStream inputStream = file.getInputStream();
this.uploadFile2OSS(inputStream, fileName);
return fileName;
}
catch (Exception e)
{
return "上传失败";
}
} /**
* 2、多文件上传
* @param fileList
* @return 返回完整URL,逗号分隔
*/
public String uploadFile(List<MultipartFile> fileList) {
String fileUrl = "";
String str = "";
String photoUrl = "";
for(int i = 0;i< fileList.size();i++){
fileUrl = uploadImg2Oss(fileList.get(i));
str = getFileUrl(fileUrl);
if(i == 0){
photoUrl = str;
}else {
photoUrl += "," + str;
}
}
return photoUrl.trim();
} /**
* 3、通过文件名获取文完整件路径
* @param fileUrl
* @return 完整URL路径
*/
public String getFileUrl(String fileUrl)
{
if (fileUrl !=null && fileUrl.length()>0) {
String[] split = fileUrl.split("/");
String url = this.getUrl(this.filedir + split[split.length - 1]);
return url;
}
return null;
} //-----------内部辅助功能------------------------
//获取去掉参数的完整路径
private String getShortUrl(String url)
{
String[] imgUrls = url.split("\\?");
return imgUrls[0].trim();
}
// 获得url链接
private String getUrl(String key) {
// 设置URL过期时间为20年 3600l* 1000*24*365*20
Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 20);
// 生成URL
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
URL url = ossClient.generatePresignedUrl(bucketName, key, expiration);
if (url != null)
{
return getShortUrl(url.toString());
}
return null;
} // 上传文件
private String uploadImg2Oss(MultipartFile file)
{
//1、限制最大文件为20M
if (file.getSize() > 1024 * 1024 *20)
{
return "图片太大";
}
//2、重命名文件
// String originalFilename = file.getOriginalFilename();
// String substring = originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase();
// Random random = new Random();
// String name = random.nextInt(10000) + System.currentTimeMillis() + substring; String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf(".")).toLowerCase(); //文件后缀
String uuid = UUID.randomUUID().toString();
String name = uuid + suffix; try
{
InputStream inputStream = file.getInputStream();
this.uploadFile2OSS(inputStream, name);
return name;
}
catch (Exception e)
{
return "上传失败";
}
} // 上传文件(指定文件名) private String uploadFile2OSS(InputStream instream, String fileName)
{
String ret = "";
try {
//创建上传Object的Metadata
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(instream.available());
objectMetadata.setCacheControl("no-cache");
objectMetadata.setHeader("Pragma", "no-cache");
objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
objectMetadata.setContentDisposition("inline;filename=" + fileName);
//上传文件 OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
PutObjectResult putResult = ossClient.putObject(bucketName, filedir + fileName, instream, objectMetadata);
ret = putResult.getETag();
} catch (IOException e) {
log.error(e.getMessage(), e);
} finally {
try {
if (instream != null) {
instream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return ret;
} private static String getcontentType(String FilenameExtension)
{
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpeg";
}
if (FilenameExtension.equalsIgnoreCase(".html")) {
return "text/html";
}
if (FilenameExtension.equalsIgnoreCase(".txt")) {
return "text/plain";
}
if (FilenameExtension.equalsIgnoreCase(".vsd")) {
return "application/vnd.visio";
}
if (FilenameExtension.equalsIgnoreCase(".pptx") ||
FilenameExtension.equalsIgnoreCase(".ppt")) {
return "application/vnd.ms-powerpoint";
}
if (FilenameExtension.equalsIgnoreCase(".docx") ||
FilenameExtension.equalsIgnoreCase(".doc")) {
return "application/msword";
}
if (FilenameExtension.equalsIgnoreCase(".xml")) {
return "text/xml";
}
//PDF
if (FilenameExtension.equalsIgnoreCase(".pdf")) {
return "application/pdf";
}
return "image/jpeg";
} }

1-4、调用

controller:

/**
* 描述: OSS controller
* 版权: Copyright (c) 2020
* 公司: XXX
* 作者: yanghj
* 版本: 4.0
* 创建日期: 2020/9/16 10:33
*/
@RestController
@RequestMapping("oss")
@Api(value = "OSS",tags = "OSS上传接口")
public class OssController
{ @Autowired
private OssUtil ossUtil; //1、注入OssUtil @PostMapping("/uploadfile")
@ApiOperation(value = "上传", notes = "上传")
public Object fileUpload(@RequestParam MultipartFile file)
{
try
{ String url = ossUtil.uploadFile(file); //2、调用 Map<String, Object> returnbody = new HashMap<>();
Map<String, Object> returnMap = new HashMap<>();
returnMap.put("url", url);
returnbody.put("data",returnMap);
returnbody.put("code","200");
returnbody.put("message","上传成功");
return returnbody;
}
catch (Exception e)
{
Map<String, Object> returnbody = new HashMap<>();
returnbody.put("data",null);
returnbody.put("code","400");
returnbody.put("message","上传失败");
return returnbody;
} } }

运行结果:

运行,可用阿里云提供的 OSS Browser直接看到结果;

2、总结

  阿里云OSS使用简单方便,官方提供的OSS Browser工具也很方便,按流量计费,费用也还不算贵,如果数据量也不是那么大,费用可接受,采用它无疑是最方便的;当然,如果不想付费使用,用minio自建文件服务也是很方便的,这个我们后面来说;

小白的springboot之路(十七)、阿里云OSS 的使用的更多相关文章

  1. SpringBoot 2.0整合阿里云OSS,实现动静分离架构

    前言 相信大部分开发者对下面这张架构图并不陌生吧,现在很多网站/应用都采用了动静分离的架构进行部署.博主的博客也不例外,主机采用的是阿里云的 ECS,使用 CDN 做静态内容分发,不过静态文件还是存储 ...

  2. SpringBoot整合阿里云OSS文件上传、下载、查看、删除

    1. 开发前准备 1.1 前置知识 java基础以及SpringBoot简单基础知识即可. 1.2 环境参数 开发工具:IDEA 基础环境:Maven+JDK8 所用技术:SpringBoot.lom ...

  3. 小白的springboot之路(一)、环境搭建、第一个实例

    小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...

  4. 保姆级SpringBoot+Vue图片上传到阿里云OSS教程

    小二是新来的实习生,作为技术 leader,我给他安排了一个非常简单的练手任务,把前端 markdown 编辑器里上传的图片保存到服务器端,结果他真的就把图片直接保存到了服务器上,这下可把我气坏了,就 ...

  5. 物联网架构成长之路(18)-接阿里云OSS服务

    1.申请/购买OSS服务 在阿里云上申请/购买OSS服务, 然后在会得AccessKeyID,AccessKeySecret,bucketName 这三个东西 2.增删改查 在pom.xml文件上增加 ...

  6. SpringBoot整合阿里云OSS对象存储实现文件上传

    1. 准备工作: 一.首先登录阿里云OSS对象存储控制台创建一个Bucket作为你的存储空间. 二.创建Access Keyan按要求创建进行,这里的方法步骤我就不展现出来了,你们可以自行查询阿里云文 ...

  7. Springboot项目之阿里云OSS快速入门

    阿里云oss 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量.安全.低成本.高可靠的云存储服务.您可以通过本文档提供的简单的REST接口,在任何 ...

  8. 关于 tp5.0 阿里云 oss 上传文件操作

    tp5.0 结合阿里云oss 上传文件 1.引入 oss 的空间( composer install 跑下第三方拓展包及核心代码包) 备注:本地测试无误,放到线上有问题  应该是移动后的路劲(相对于服 ...

  9. C# .net Ueditor实现图片上传到阿里云OSS 对象存储

    在学习的时候,项目中需要实现在Ueditor编辑器中将图片上传到云储存中,老师演示的是上传到又拍云存储,既然看了一遍,直接照搬不算本事,咱们可以依葫芦画瓢自己来动手玩玩其它的云存储服务. 现在云计算产 ...

随机推荐

  1. start-stop-daemon: matching on world-writable pidfile /var/run/redis/redis-server.pid is insecurefailed

    Microsoft Store上 看到最新的Ubuntu 20.04 LTS 已经适配到WSL上了, 于是卸载了老版本 18.04 LTS,安装上了最新版本的. 第一次启动会比较慢,需耐心等待 Ins ...

  2. 感谢 Vue.js 拯救我这个前端渣渣,让 PowerJob 有了管理后台界面

    本文适合有 Java 基础知识的人群 作者:HelloGitHub-Salieri HelloGitHub 推出的<讲解开源项目>系列. 对于大部分非前端程序员来说,写网页无疑是一件非常痛 ...

  3. Navicat15破解+网盘位置

    百度网盘Navicat.15位置 链接:https://pan.baidu.com/s/1Vn0Qnt8IUA37a-p4hAnk5g 提取码:clq3 1.百度网盘下载完后,点这个安装Navicat ...

  4. SparkStreaming架构

    SparkStreaming是一个对实时数据流进行高通量.容错处理的流式处理系统,可以对多种数据源(如Kdfka.Flume.Twitter.Zero和TCP 套接字)进行类似Map.Reduce和J ...

  5. Rainbow: Combining Improvements in Deep Reinforcement Learning

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1710.02298v1 [cs.AI] 6 Oct 2017 (AAAI 2018) Abstract 深度强化学习社区对D ...

  6. WebApis中DOM操作的基本案例

    1.1. 排他操作 1.1.1 排他思想 如果有同一组元素,我们想要某一个元素实现某种样式, 需要用到循环的排他思想算法: 所有元素全部清除样式(干掉其他人) 给当前元素设置样式 (留下我自己) 注意 ...

  7. 学习一下 JVM (三) -- 了解一下 垃圾回收

    一.简单了解几个概念 1.什么是垃圾(Garbage)?什么是垃圾回收(Garbage Collection,简称 GC)? (1)什么是垃圾(Garbage)? 这里的垃圾 指的是 在程序运行过程中 ...

  8. Python办公自动化之Excel做表自动化:全网最全,看这一篇就够了!

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  9. Spine学习八 - 幻影特效

    Spine支持一些自带的特效,这些特效,不需要在spine中制作,而只是通过在unity中添加一些脚本便可实现. 这里先讲解一个比较使用又酷炫的效果,幻影特效: 1. 首先,在SkeletonAnim ...

  10. python小白入门基础(二:变量)

    #变量:可以改变的量就是变量,实际上是由内存开辟的一块空间,临时存在内存中,以便后续代码使用.#作用:代指内存中某个地址中的内容. #1.变量的概念name = "王五"name ...