阿里OSS工具类

article/2025/9/27 9:54:56

参考博客:阿里OSS入门

bucket配置信息:alios.properties

在这里插入图片描述

OSS配置文件:AliOSSConfig.java

@Data
public class AliOSSConfig {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;private  AliOSSConfig(){Properties properties = new Properties();try {properties.load(AliOSSConfig.class.getResourceAsStream("/oss/alioss.properties"));} catch (IOException e) {e.printStackTrace();}endpoint = properties.getProperty("endpoint");accessKeyId= properties.getProperty("accessKeyId");accessKeySecret= properties.getProperty("accessKeySecret");bucketName= properties.getProperty("bucketName");}private static AliOSSConfig instance = new AliOSSConfig();public static AliOSSConfig getInstance() {return instance;}
}

工具类:AliOSSUtil.java

public class AliOSSUtil {private static final String endpoint = AliOSSConfig.getInstance().getEndpoint();private static final String accessKeyId = AliOSSConfig.getInstance().getAccessKeyId();private static final String accessKeySecret = AliOSSConfig.getInstance().getAccessKeySecret();private static final String bucketName = AliOSSConfig.getInstance().getBucketName();/*** 将文件上传到阿里OSS** @param sourceFilePathName 本地文件* @param aimFilePathName    在阿里OSS中保存的可以包含路径的文件名* @return 返回上传后文件的访问路径* @throws FileNotFoundException*/public static String upload(String sourceFilePathName, String aimFilePathName) throws FileNotFoundException {FileInputStream is = new FileInputStream(sourceFilePathName);if (aimFilePathName.startsWith("/")) {aimFilePathName = aimFilePathName.substring(1);}// 如果需要上传时设置存储类型与访问权限,请参考以下示例代码。ObjectMetadata metadata = new ObjectMetadata();int indexOfLastDot = aimFilePathName.lastIndexOf(".");String suffix = aimFilePathName.substring(indexOfLastDot);metadata.setContentType(getContentType(suffix));//避免文件覆盖aimFilePathName = aimFilePathName.substring(0, indexOfLastDot) + System.currentTimeMillis() + suffix;PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, aimFilePathName, is);//避免访问时将图片下载下来putObjectRequest.setMetadata(metadata);OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(putObjectRequest);Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);URL url = ossClient.generatePresignedUrl(bucketName, aimFilePathName, expiration);// 关闭ossClientossClient.shutdown();return url.toString();}/*** 网络实现上传头像到OSS** @param multipartFile* @return*/public static String upload(MultipartFile multipartFile) throws IOException {// 获取上传的文件的输入流InputStream inputStream = multipartFile.getInputStream();// 获取文件名称String fileName = multipartFile.getOriginalFilename();// 避免文件覆盖int i = fileName.lastIndexOf(".");String suffix = fileName.substring(i);fileName = fileName.substring(0, i) + System.currentTimeMillis() + suffix;// 把文件按照日期进行分类// 获取当前日期String datePath = DateTimeFormatter.ISO_DATE.format(LocalDate.now());// 拼接fileNamefileName = datePath + "/" + fileName;// 如果需要上传时设置存储类型与访问权限ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType(getContentType(fileName.substring(fileName.lastIndexOf("."))));// 上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, fileName, inputStream);putObjectRequest.setMetadata(metadata);OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(putObjectRequest);//文件访问路径Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);URL url = ossClient.generatePresignedUrl(bucketName, fileName, expiration);// 关闭ossClientossClient.shutdown();// 把上传到oss的路径返回return url.toString();}/*** 返回contentType** @param FileNameExtension* @return*/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/jpg";}return "image/jpg";}/*** 列举 指定路径下所有的文件的文件名* 如果要列出根路径下的所有文件,path= ""** @param path* @return*/public static List<String> listFileName(String path) {List<String> res = new ArrayList<>();// 构造ListObjectsRequest请求。ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);// 设置prefix参数来获取fun目录下的所有文件。listObjectsRequest.setPrefix(path);OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 列出文件。ObjectListing listing = ossClient.listObjects(listObjectsRequest);// 遍历所有文件for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {System.out.println(objectSummary.getKey());}// 关闭OSSClient。ossClient.shutdown();return res;}/*** 列举文件下所有的文件url信息*/public static List<String> listFileUrl(String path) {List<String> res = new ArrayList<>();// 构造ListObjectsRequest请求ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);// 设置prefix参数来获取fun目录下的所有文件。listObjectsRequest.setPrefix(path);OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 列出文件。ObjectListing listing = ossClient.listObjects(listObjectsRequest);// 遍历所有文件。for (OSSObjectSummary objectSummary : listing.getObjectSummaries()) {//文件访问路径Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000 * 24 * 365 * 100);URL url = ossClient.generatePresignedUrl(bucketName, objectSummary.getKey(), expiration);res.add(url.toString());}// 关闭OSSClient。ossClient.shutdown();return res;}/*** 判断文件是否存在** @param objectName* @return*/public static boolean isFileExist(String objectName) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);boolean res = ossClient.doesObjectExist(bucketName, objectName);return res;}/*** 通过文件名下载文件** @param objectName    要下载的文件名* @param localFileName 本地要创建的文件名*/public static void downloadFile(String objectName, String localFileName) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 下载OSS文件到本地文件。如果指定的本地文件存在会覆盖,不存在则新建。ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(localFileName));// 关闭OSSClient。ossClient.shutdown();}/*** 删除文件或目录** @param objectName*/public static void delelteFile(String objectName) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.deleteObject(bucketName, objectName);ossClient.shutdown();}/*** 批量删除文件或目录** @param keys*/public static void deleteFiles(List<String> keys) {OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 删除文件。DeleteObjectsResult deleteObjectsResult = ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));java.util.List<String> deletedObjects = deleteObjectsResult.getDeletedObjects();ossClient.shutdown();}/*** 创建文件夹** @param folder* @return*/public static String createFolder(String folder) {// 文件夹名final String keySuffixWithSlash = folder;OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);// 判断文件夹是否存在,不存在则创建if (!ossClient.doesObjectExist(bucketName, keySuffixWithSlash)) {// 创建文件夹ossClient.putObject(bucketName, keySuffixWithSlash, new ByteArrayInputStream(new byte[0]));// 得到文件夹名OSSObject object = ossClient.getObject(bucketName, keySuffixWithSlash);String fileDir = object.getKey();ossClient.shutdown();return fileDir;}return keySuffixWithSlash;}}

注意:为了避免OSS链接出现 connection pool shutdown错误,不要在类中创建了OSSClient对象 ,因为这样做的话所有方法共用此实例对象,在前端很短的时间内连续提交,造成异常错误。应该将OSSClient对象在方法中创建。

测试代码

class AliOSSUtilTest {@Testvoid upload() throws FileNotFoundException {//上传文件String url = AliOSSUtil.upload("E:\\图片\\510.jpg", "/aa/bb/ba.jpg");System.out.println(url);}@Testvoid listFileName() {List<String> res = AliOSSUtil.listFileName("aa/");res.forEach(System.out::println);}@Testvoid listFileUrl() {List<String> res = AliOSSUtil.listFileUrl("aa/");res.forEach(System.out::println);}@Testvoid isFileExist() {boolean res = AliOSSUtil.isFileExist("aa/bb/ab1637160001528.jpg");System.out.println(res);}@Testvoid downloadFile() {AliOSSUtil.downloadFile("aa/bb/ab1637160001528.jpg", "d:/aaawer.jpg");}@Testvoid delelteFile() {AliOSSUtil.delelteFile("aa/bb/ab1637160001528.jpg");}@Testvoid deleteFiles() {List<String> keys = List.of("aa/bb/ab1637160001528.jpg", "aa/bb/ba1637160268079.jpg","aa/bb/cc");AliOSSUtil.deleteFiles(keys);}@Testvoid createFolder() {String folder = AliOSSUtil.createFolder("aa/bb/cc");System.out.println(folder);}}

http://chatgpt.dhexx.cn/article/OIb09VTM.shtml

相关文章

Guava Lists工具类

文章目录 01 概述02 Lists工具类03 文末 01 概述 Guava 是 Google 开源的一个 Java 工具库&#xff0c;里面有很多工具类&#xff0c;本文要讲的是里面的Lists工具类。 注意&#xff0c;使用Guava工具类库&#xff0c;必须先添加依赖&#xff1a; <dependency><gro…

JAVA之常用的工具类

目录 1 集合工具类 1.1 java.util.Collections 1.1.1 基本操作 1.1.2 转换线程安全集合 1.2 org.springframework.util.CollectionUtils 1.3 org.apache.commons.collections.CollectionUtils 1.4 org.apache.commons.lang.ArrayUtils 1.5 org.apache.commons.lang3.Ar…

常用的Java开发工具类

前言 在java的庞大体系中&#xff0c;其实有很多不错的小工具&#xff0c;也就是我们平常说的&#xff1a;轮子。 如果在我们的日常工作当中&#xff0c;能够将这些轮子用户&#xff0c;再配合一下idea的快捷键&#xff0c;可以极大得提升我们的开发效率。 今天我决定把一些…

工具类的详解

工具类网站 1、工具类 1.1 定义 工具类是为了提供一些通用的、某一非业务领域内的公共方法&#xff0c;不需要配套的成员变量&#xff0c;仅仅是作为工具方法被使用。所以将它做成静态方法最合适&#xff0c;不需要实例化&#xff0c;能够获取到方法的定义并调用就行。 1.2…

学习日记-安卓Package Manager和Package Installer

安装和卸载APK&#xff08;安卓应用程序包文件&#xff09;&#xff0c;运作原理。 什么是Package Manager&#xff08;包管理器&#xff09;和Package Installer&#xff08;程序安装包&#xff09;&#xff1f; APK文件保存在Android的哪个地方&#xff1f; APK文件安装过…

PackageInstaller (tv 修改安装app界面按钮及自动获取焦点)附源码分析

\packages\apps\PackageInstaller 一、一条真实的修改记录 TVOS基于的是一套板卡厂商原有的源码(mstar android8.0版本&#xff09;原生的这个app安装界面&#xff0c;存在俩个比较严重的用户体验问题&#xff0c; 1’、下面那俩按钮太小了&#xff0c;而且…

android packages/apps 加入工程,深入安卓Package Manager和Package Installer

我们每天都在安装和卸载APK(安卓应用程序包文件)&#xff0c;或许一天会有好几次&#xff0c;但是你有想过下面问题吗&#xff1f;什么是Package Manager(包管理器)和Package Installer(程序安装包)&#xff1f; APK文件保存在Android的哪个地方&#xff1f; APK文件安装过程的…

RK3568平台开发系列讲解(安卓篇)PackageInstaller(应用安装)流程介绍

文章目录 <font color=#0990d9>一、PackageInstaller入口<font color=#0990d9>二、InstallStart<font color=#0990d9>三、InstallStaging<font color=#0990d9>四、PackageInstallerActivity<font color=#0990d9>五、InstallInstalling<font c…

Android9.0 PM机制系列(一)PackageInstaller初始化解析

前言 包管理机制是Android中的重要机制&#xff0c;是应用开发和系统开发需要掌握的知识点之一。 包指的是Apk、jar和so文件等等&#xff0c;它们被加载到Android内存中&#xff0c;由一个包转变成可执行的代码&#xff0c;这就需要一个机制来进行包的加载、解析、管理等操作&…

PackageInstaller源码分析(一)

本篇博客分析PackageInstaller源码目的是分析Android权限机制&#xff0c;Android App的权限在应用被安装时&#xff0c;用户选择授予或者拒绝。所以&#xff0c;分析Android权限机制源码的第一步分析应用程序安装时的行为。   此次阅读源码旨在解决的问题&#xff1a;Andro…

A*B problem(FFT)

A*B problem&#xff08;FFT&#xff09; 设两个多项式\(A(x)\)和\(B(x)\)&#xff0c;它们的系数镜像反转一下&#xff0c;得到的多项式是\(A(x)\)和\(B(x)\)。那么\(C(x)A(x)*B(x)\)和\(C(x)A(x)*B(x)\)的系数也是镜像反转的。这个&#xff0c;&#xff0c;感性理解一下吧。 …

【kissfft】使用过程中的一些坑总结

API kissfft有两套API&#xff0c; 一个是在kiss_fftr.h中 另一个在kiss_fft.h中 区别 Basic API还是kiss_fft.h里的&#xff0c;kiss_fftr.h是在kiss_fft.h的基础上封装了一层。 Basic API只有fft没有见到ifft&#xff1f;&#xff1f; 利用频域数据的共轭对称性可以使用…

2020山东大学计算机组成原理课程设计报告

《计算机组成原理》 课程设计报告 微指令模型机实现 班级&#xff1a; 姓名&#xff1a; 学号&#xff1a; 小组成员&#xff1a; 完成日期&#xff1a;2020.10.16 一、计算机的功能和用途 通过该课程设计的学习&#xff0c;我们设计一台模型机&#xff0c;该模型机运行…

创建react应用程序_创建多版本React应用程序的6个步骤

创建react应用程序 The React team said that there are no new features in React 17, but react17.0.0-rc.0 comes with the power to lazy load and deep integrate multiple versions of React. This no-feature is larger than any feature, which is a stepping stone fo…

你真的懂package.json吗

点击蓝字 「前端小苑」关注我 作者 | MasonEast 编辑 | 桔子酱 前言 在Node.js中&#xff0c;模块是一个库或框架&#xff0c;也是一个Node.js项目。Node.js项目遵循模块化的架构&#xff0c;当我们创建了一个Node.js项目&#xff0c;意味着创建了一个模块&#xff0c;这个模块…

《Linux编程》上机作业 ·004【文件I/O操作】

注&#xff1a;前言、目录见 https://blog.csdn.net/qq_44220418/article/details/108428971 友情提醒&#xff1a;仅供参考理解&#xff0c;请勿直接复制粘贴 友情提醒&#xff1a;仅供参考理解&#xff0c;请勿直接复制粘贴 友情提醒&#xff1a;仅供参考理解&#xff0c;…

CPU比GPU训练神经网络快十几倍,英特尔:别用矩阵运算了

来源丨机器之心 神经网络训练通常是 GPU 大显身手的领域&#xff0c;然而莱斯大学和英特尔等机构对 GPU 的地位发起了挑战。 在深度学习与神经网络领域&#xff0c;研究人员通常离不开 GPU。得益于 GPU 极高内存带宽和较多核心数&#xff0c;研究人员可以更快地获得模型训练的结…

用于基于 CNT 的射频辐射热计开发研究的 CPX-VF 探针台

我们会不时强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是阿克伦大学领导的工作&#xff0c;并发表在上个月的IEEE 微波理论与技术汇刊上。与来自美国陆军和 Nano-C Inc.&#xff08;马萨诸塞州 Westwood 的纳米结构碳材料及其应用开发商&#xff09;的研究人员…

ProJet 3510 CPX蜡模3D打印机在珠宝行业成功应用

传统的首饰设计是一个细致和增量的过程。传统设计从设计师的构图开始&#xff0c;一旦草图被批准后,就会雕刻成模型&#xff0c;如果蜡模没有足够接近原始草图或未能满足客户的期望&#xff0c;必须重做,这样会浪费大量的时间。使用ProJet 3510 CPX专业蜡成型3 d打印机&#xf…

基于 CNT 的射频辐射热计开发研究的 CPX-VF 低温探针台

有时&#xff0c;我们喜欢强调我们的低温探针台如何用于有趣的研究。我们最新的应用重点是由阿克伦大学领导并发表在上个月的IEEE Transactions on Microwave Theory and Techniques 上的工作。UA 的 ZEN-Lab 的Michael Gasper 和 Ryan Toonen 博士与美国陆军和 Nano-C Inc.&am…