title: 【2】从零玩转OSS阿里云存储服务之Java代码操作
date: 2021-06-09 17:37:14.486
updated: 2021-12-26 17:43:12.779
url: https://www.yby6.com/archives/2-cong-ling-wan-zhuan-oss-a-li-yun-cun-chu-fu-wu-zhi-java-dai-ma-cao-zuo
categories:
- OSS
tags:
- OSS
- java
- 文件上传

接上一个文章讲解还有一个东西忘记说

AccessKey 这玩意用来搞认证的 差不多

开通就好了..等会要用到

步入正题创建oss模块也就是一个项目

导入依赖

    <dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency> <dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<!-- 上传文件依赖组件 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency> <dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- aliyun oss -->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.7.RELEASE</version>
<scope>test</scope>
</dependency> </dependencies>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>

创建OSSUploadUtil.java

package top.yangbuyi.utils;

import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import top.yangbuyi.utils.config.OSSConfig; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: OSSUtils
* @create: 2020-08-11 23:09
* @author: yangbuyi
* @since: JDK1.8
* @OSSUploadUtil: 阿里云OSS文件上传工具类
**/ public class OSSUploadUtil { private static OSSConfig config = null; /**
*
* @MethodName: uploadFile
* @Description: OSS单文件上传
* @param file
* @param fileType 文件后缀
* @return String 文件地址
*/
public static String uploadFile(File file, String fileType){
config = config==null?new OSSConfig():config;
String fileName = config.getPicLocation()+ UUID.randomUUID().toString().toUpperCase().replace("-", "")+"."+fileType; //文件名,根据UUID来
return putObject(file,fileType,fileName);
} /**
*
* @MethodName: updateFile
* @Description: 更新文件:只更新内容,不更新文件名和文件地址。
* (因为地址没变,可能存在浏览器原数据缓存,不能及时加载新数据,例如图片更新,请注意)
* @param file
* @param fileType
* @param oldUrl
* @return String
*/
public static String updateFile(File file,String fileType,String oldUrl){
String fileName = getFileName(oldUrl);
if(fileName==null) return null;
return putObject(file,fileType,fileName);
} /**
*
* @MethodName: replaceFile
* @Description: 替换文件:删除原文件并上传新文件,文件名和地址同时替换
* 解决原数据缓存问题,只要更新了地址,就能重新加载数据)
* @param file
* @param fileType 文件后缀
* @param oldUrl 需要删除的文件地址
* @return String 文件地址
*/
public static String replaceFile(File file,String fileType,String oldUrl){
boolean flag = deleteFile(oldUrl); //先删除原文件
if(!flag){
//更改文件的过期时间,让他到期自动删除。
}
return uploadFile(file, fileType);
} /**
*
* @MethodName: deleteFile
* @Description: 单文件删除
* @param fileUrl 需要删除的文件url
* @return boolean 是否删除成功
*/
public static boolean deleteFile(String fileUrl){
config = config==null?new OSSConfig():config; String bucketName = OSSUploadUtil.getBucketName(fileUrl); //根据url获取bucketName
String fileName = OSSUploadUtil.getFileName(fileUrl); //根据url获取fileName
if(bucketName==null||fileName==null) return false;
OSSClient ossClient = null;
try {
ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
GenericRequest request = new DeleteObjectsRequest(bucketName).withKey(fileName);
ossClient.deleteObject(request);
} catch (Exception oe) {
oe.printStackTrace();
return false;
} finally {
ossClient.shutdown();
}
return true;
} /**
*
* @MethodName: batchDeleteFiles
* @Description: 批量文件删除(较快):适用于相同endPoint和BucketName
* @param fileUrls 需要删除的文件url集合
* @return int 成功删除的个数
*/
public static int deleteFile(List<String> fileUrls){
int deleteCount = 0; //成功删除的个数
String bucketName = OSSUploadUtil.getBucketName(fileUrls.get(0)); //根据url获取bucketName
List<String> fileNames = OSSUploadUtil.getFileName(fileUrls); //根据url获取fileName
if(bucketName==null||fileNames.size()<=0) return 0;
OSSClient ossClient = null;
try {
ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
DeleteObjectsRequest request = new DeleteObjectsRequest(bucketName).withKeys(fileNames);
DeleteObjectsResult result = ossClient.deleteObjects(request);
deleteCount = result.getDeletedObjects().size();
} catch (OSSException oe) {
oe.printStackTrace();
throw new RuntimeException("OSS服务异常:", oe);
} catch (ClientException ce) {
ce.printStackTrace();
throw new RuntimeException("OSS客户端异常:", ce);
} finally {
ossClient.shutdown();
}
return deleteCount; } /**
*
* @MethodName: batchDeleteFiles
* @Description: 批量文件删除(较慢):适用于不同endPoint和BucketName
* @param fileUrls 需要删除的文件url集合
* @return int 成功删除的个数
*/
public static int deleteFiles(List<String> fileUrls){
int count = 0;
for (String url : fileUrls) {
if(deleteFile(url)){
count++;
}
}
return count;
} /**
*
* @MethodName: putObject
* @Description: 上传文件
* @param file
* @param fileType
* @param fileName
* @return String
*/
private static String putObject(File file,String fileType,String fileName){
config = config==null?new OSSConfig():config;
String url = null; //默认null
OSSClient ossClient = null;
try {
ossClient = new OSSClient(config.getEndpoint(), config.getAccessKeyId(), config.getAccessKeySecret());
InputStream input = new FileInputStream(file);
ObjectMetadata meta = new ObjectMetadata(); // 创建上传Object的Metadata
meta.setContentType(OSSUploadUtil.contentType(fileType)); // 设置上传内容类型
meta.setCacheControl("no-cache"); // 被下载时网页的缓存行为
PutObjectRequest request = new PutObjectRequest(config.getBucketName(), fileName,input,meta); //创建上传请求
ossClient.putObject(request);
url = config.getEndpoint().replaceFirst("https://","https://"+config.getBucketName()+"."+ config.getEndpoint())+"/"+fileName; //上传成功再返回的文件路径
} catch (OSSException oe) {
oe.printStackTrace();
return null;
} catch (ClientException ce) {
ce.printStackTrace();
return null;
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} finally {
ossClient.shutdown();
}
return url;
} /**
*
* @MethodName: contentType
* @Description: 获取文件类型
* @param FileType
* @return String
*/
private static String contentType(String fileType){
fileType = fileType.toLowerCase();
String contentType = "";
switch (fileType) {
case "bmp": contentType = "image/bmp";
break;
case "gif": contentType = "image/gif";
break;
case "png":
case "jpeg":
case "jpg": contentType = "image/jpeg";
break;
case "html":contentType = "text/html";
break;
case "txt": contentType = "text/plain";
break;
case "vsd": contentType = "application/vnd.visio";
break;
case "ppt":
case "pptx":contentType = "application/vnd.ms-powerpoint";
break;
case "doc":
case "docx":contentType = "application/msword";
break;
case "xml":contentType = "text/xml";
break;
case "mp4":contentType = "video/mp4";
break;
default: contentType = "application/octet-stream";
break;
}
return contentType;
} /**
*
* @MethodName: getBucketName
* @Description: 根据url获取bucketName
* @param fileUrl 文件url
* @return String bucketName
*/
private static String getBucketName(String fileUrl){
String http = "http://";
String https = "https://";
int httpIndex = fileUrl.indexOf(http);
int httpsIndex = fileUrl.indexOf(https);
int startIndex = 0;
if(httpIndex==-1){
if(httpsIndex==-1){
return null;
}else{
startIndex = httpsIndex+https.length();
}
}else{
startIndex = httpIndex+http.length();
}
int endIndex = fileUrl.indexOf(".oss-");
return fileUrl.substring(startIndex, endIndex);
} /**
*
* @MethodName: getFileName
* @Description: 根据url获取fileName
* @param fileUrl 文件url
* @return String fileName
*/
private static String getFileName(String fileUrl){
String str = "yangbuyi.top/";
int beginIndex = fileUrl.indexOf(str);
if(beginIndex==-1) return null;
return fileUrl.substring(beginIndex+str.length());
} /**
*
* @MethodName: getFileName
* @Description: 根据url获取fileNames集合
* @param fileUrl 文件url
* @return List<String> fileName集合
*/
private static List<String> getFileName(List<String> fileUrls){
List<String> names = new ArrayList<>();
for (String url : fileUrls) {
names.add(getFileName(url));
}
return names;
}
}

创建Config.properties配置文件到resources下

#阿里云OSS配置
endpoint = oss-img.yangbuyi.top # 访问节点 这里表示 uri访问的图片域名相当于一个域名
bucketName = yangbuyi-img # 你创建的Bucket
picLocation = 文件夹路径 随便填 如: yangbuyi/
accessKeyId = 第一张图片要你开通的 ID
accessKeySecret = 第一张图片要你开通的 密码

创建SystemConfig.java 处理配置文件

package top.yangbuyi.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: SystemConfig
* @create: 2020-08-12 00:04
* @author: yangbuyi
* @since: JDK1.8
* @SystemConfig:
**/
public class SystemConfig { private static final String CONFIG_PROPERTIES="config.properties"; public static String getConfigResource(String key) throws IOException {
ClassLoader loader = Thread.currentThread().getContextClassLoader();
Properties properties = new Properties();
InputStream in = loader.getResourceAsStream(CONFIG_PROPERTIES);
properties.load(in);
String value = properties.getProperty(key);
// 编码转换,从ISO-8859-1转向指定编码
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
in.close();
return value;
}
}

创建config文件夹下的OSSConfig.java

package top.yangbuyi.utils.config;

import top.yangbuyi.utils.SystemConfig;

import java.io.IOException;

/**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: OSSConfig
* @create: 2020-08-12 00:04
* @author: yangbuyi
* @since: JDK1.8
* @OSSConfig:
**/ public class OSSConfig{
private String endpoint; //连接区域地址
private String accessKeyId; //连接keyId
private String accessKeySecret; //连接秘钥
private String bucketName; //需要存储的bucketName
private String picLocation; //图片保存路径 /*
* 加载配置文件 初始化 参数
* 也可 yml加载 看你自己
* */ public OSSConfig() {
try {
this.endpoint = SystemConfig.getConfigResource("endpoint");
this.bucketName = SystemConfig.getConfigResource("bucketName");
this.picLocation = SystemConfig.getConfigResource("picLocation");
this.accessKeyId = SystemConfig.getConfigResource("accessKeyId");
this.accessKeySecret = SystemConfig.getConfigResource("accessKeySecret");
} catch (IOException e) {
e.printStackTrace();
}
} public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public String getPicLocation() {
return picLocation;
}
public void setPicLocation(String picLocation) {
this.picLocation = picLocation;
} @Override
public String toString() {
return "OSSConfig{" +
"endpoint='" + endpoint + '\'' +
", accessKeyId='" + accessKeyId + '\'' +
", accessKeySecret='" + accessKeySecret + '\'' +
", bucketName='" + bucketName + '\'' +
", picLocation='" + picLocation + '\'' +
'}';
}
}

在测试当中创建测试类

import org.junit.Test;
import top.yangbuyi.utils.OSSUploadUtil;
import top.yangbuyi.utils.OSSUtils; import java.io.File; /**
* @description: 杨不易网站:www.yangbuyi.top
* @program: yangbuyispringcloudparent
* @ClassName: two
* @create: 2020-08-12 00:06
* @author: yangbuyi
* @since: JDK1.8
* @two: OSSUploadUtil.uploadFile(File file, String fileType) //单文件上传,type:文件后缀名
* OSSUploadUtil.updateFile(File file, String fileType, String oldUrl)//更新文件:只更新内容,不更新文件名和文件地址。
* OSSUploadUtil.replaceFile(File file, String fileType, String oldUrl)//替换文件,删除源文件并上传新文件,文件名和地址也改变
* OSSUploadUtil.deleteFile(List<String> fileUrls) //删除多文件,根据问价url来自定获取其中的bucket和文件名,用于bucket和文件名可能存在不同的,循环调用deleteFile方法
* OSSUploadUtil.deleteFile(String fileUrl) //删除单文件
* OSSUploadUtil.deleteFiles(List<String> fileUrls) //删除多文件,根据配置直接取删除多个文件,bucket和文件地址从配置中获取,用于多文件bucket和文件名都相同的
**/ public class two { @Test
public void t() {
// 文件上传
File file = new File("F:\\美女图片\\dac18dd66fbbf53ddd55563b5edecac6.jpg");
String jpg = OSSUploadUtil.uploadFile(file, "jpg");
System.out.println(jpg); // 更新 只更新 图片 不更新名称
System.out.println("更新图片开始:" + "http://oss-img.yangbuyi.top/github.png");
File file2 = new File("F:\\美女图片\\httpsimg2020.cnblogs.comblog17352552020081735255-20200805220326890-2058657956.jpg");
String jpg1 = OSSUploadUtil.updateFile(file2, "jpg", "http://oss-img.yangbuyi.top/github.png");
System.out.println("更新后的:" + jpg1); // 删除 根据url 删除图片
// boolean b = OSSUploadUtil.deleteFile("https://yangbuyi.oss-cn-beijing.aliyuncs.com/imgBAA8AD5484D847E09BDB535765A9EEB9.jpg");
// System.out.println(b); } }

列举常用的上传

方法名 描述
OSSUploadUtil.uploadFile(File file, String fileType) 单文件上传,type:文件后缀名
OSSUploadUtil.updateFile(File file, String fileType, String oldUrl) 更新文件:只更新内容,不更新文件名和文件地址。
OSSUploadUtil.deleteFiles(List fileUrls) 删除多文件,根据配置直接取删除多个文件,bucket和文件地址从配置中获取,用于多文件bucket和文件名都相同的
OSSUploadUtil.deleteFile(String fileUrl) 根据url删除单文件
OSSUploadUtil.replaceFile(File file, String fileType, String oldUrl) 替换文件,删除源文件并上传新文件,文件名和地址也改变
OSSUploadUtil.deleteFile(List fileUrls) 删除多文件,根据问价url来自定获取其中的bucket和文件名,用于bucket和文件名可能存在不同的,循环调用deleteFile方法

看到这 是不是觉得 超级简单 就CV大法。。

看到这 是不是觉得 超级简单 就CV大法。。

给到的项目地址 有不同oss实现 本文章只讲了 OSSuploadUtil 对应的测试类为 two.java

测试完毕复制url访问

https://oss-yby.yangbuyi.top/uni-app/1602927243%281%29.jpg

项目地址: https://gitee.com/yangbuyi/ossAlibaba

oss云存储完毕

【2】从零玩转OSS阿里云存储服务之Java代码操作-2-cong-ling-wan-zhuan-oss-a-li-yun-cun-chu-fu-wu-zhi-java-dai-ma-cao-zuo的更多相关文章

  1. 【工具-代码】OSS阿里云存储服务-代码实现

    上一章节[工具]OSS阿里云存储服务--超级简单--个人还是觉得Fastdfs好玩 https://www.cnblogs.com/Yangbuyi/p/13488323.html 接上一个文章讲解还 ...

  2. 【工具】OSS阿里云存储服务--超级简单--个人还是觉得Fastdfs好玩

    介绍 阿里云对象存储服务(Object Storage Service,简称 OSS)为您提供基于网络的数据存取服务. 使用 OSS,您可以通过网络随时存储和调用包括文本.图片.音频和视频等在内的各种 ...

  3. springboot集成oss阿里云存储

    一.注册阿里云 二.购买OSS 三.创建桶 设定权限,其它默认即可 四.创建目录 点击桶名,进入创建目录即可. 五.开发文档 引入依赖: <dependency> <groupId& ...

  4. 阿里云存储OSS之九大使用技巧

    http://www.biphp.com/cloud-computing/%E9%98%BF%E9%87%8C%E4%BA%91%E5%AD%98%E5%82%A8oss%E4%B9%8B%E4%B9 ...

  5. 利用阿里云容器服务打通TensorFlow持续训练链路

    本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案 第一篇:打造TensorFlow的实验环境 第二篇:轻松搭建TensorFlow Serving集群 第三篇:打 ...

  6. OSS阿里云相关文档

    OSS阿里云相关文档 oss文档链接

  7. 阿里云存储oss+怎么上传找文件夹

    最近公司做工程项目,实现文件夹云存储上传. 网上找了很久,发现网上很多项目都存在相似问题,最后终于找到了一个符合我要求的项目. 工程如下: 这里对项目的文件夹云存储上传进行分析,实现文件夹上传,如何进 ...

  8. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  9. Knative 应用在阿里云容器服务上的最佳实践

    作者|元毅 阿里云智能事业群高级开发工程师 相信通过前面几个章节的内容,大家对 Knative 有了初步的体感,那么在云原生时代如何在云上玩转 Knative?本篇内容就给你带来了 Knative 应 ...

  10. 【New Feature】阿里云快照服务技术解析

    一.背景   目前上云已经成为行业发展趋势,越来越多的企业级客户将业务系统和数据库迁移到云上.而传统的备份一体机/备份软件方式,并不适合云上ECS.RDS等产品的备份与容灾服务.阿里云块存储服务提供云 ...

随机推荐

  1. 产品代码都给你看了,可别再说不会DDD(六):聚合根与资源库

    这是一个讲解DDD落地的文章系列,作者是<实现领域驱动设计>的译者滕云.本文章系列以一个真实的并已成功上线的软件项目--码如云(https://www.mryqr.com)为例,系统性地讲 ...

  2. Building-Mobile-Apps-with-Ionic-2中文翻译工作

    最近没啥工作量, 然后学完了这本书, 接着又茫然找不到该干啥, 所以想着何不翻译这个书呢. 这本书首先给我们普及了Ionic 2的基础知识, Ionic 2和Ionic 1有本质上的区别, Ionic ...

  3. python实现简单的爬虫功能

    前言Python是一种广泛应用于爬虫的高级编程语言,它提供了许多强大的库和框架,可以轻松地创建自己的爬虫程序.在本文中,我们将介绍如何使用Python实现简单的爬虫功能,并提供相关的代码实例. 如何实 ...

  4. DB2---创建返回结果集的函数

    在数据验证中,经常遇到需返回结果集的操作,故整理一个返回结果集的DB2函数,便于后期查阅 1.准备测试表 /*创建测试表:设置结果集的属性为表字段*/ CREATE TABLE Test_EXWAST ...

  5. 前端三件套系例之JS——JavaScript内置方法

    文章目录 1.Number 1-1 属性 1-2 方法 2.String 2-1 属性 2-2 方法 2-3 代码 3Array 3-1 创建数组 3-2 数组特点 3-3 数组的遍历(迭代) 34 ...

  6. Go 语言开发环境搭建

    Go 语言开发环境搭建 目录 Go 语言开发环境搭建 一. GO 环境安装 1.1 下载 1.2 Go 版本的选择 1.3 安装 1.3.1 Windows安装 1.3.2 Linux下安装 1.3. ...

  7. Thinking in Java 4th Edition Source Code

    Thinking in Java 4th Edition Source Code Instructions for downloading, installing and testing the so ...

  8. Go流程控制与快乐路径原则

    Go流程控制与快乐路径原则 目录 Go流程控制与快乐路径原则 一.流程控制基本介绍 二.if 语句 2.1 if 语句介绍 2.2 单分支结构的 if 语句形式 2.3 Go 的 if 语句的特点 2 ...

  9. 从零用VitePress搭建博客教程(5) - 如何自定义页面模板、给页面添加独有的className和使页面标题变成侧边目录?

    接上一节:从零用VitePress搭建博客教程(4) – 如何自定义首页布局和主题样式修改? 上一节其实我们也简单说了自定义页面模板,这一节更加详细一点说明,开始之前我们要知道在vitePress中, ...

  10. js 加密、解密算法类库

    有些功能需要前端进行加密解密,就会用到这些库 crypto-js 是一个纯 javascript 写的加密算法类库 ,可以非常方便地在 javascript 进行 MD5.SHA1.SHA2.SHA3 ...