阿里云OSS接入

1 依赖包,对应版本号

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.15.1</version></dependency>

2 配置文件

package com.jcl.magic.common.config;import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @Classname OssConfig* @Description TODO* @Date 2023/12/1 10:08* @Created by mingcai*/
@Configuration
//@PropertySource(value = {"classpath:application-oss.properties"})
@ConfigurationProperties(prefix = "aliyun")
@Data
public class OssConfig {private String endpoint;private String accessKeyId;private String accessKeySecret;private String bucketName;private String urlPrefix;@Beanpublic OSS oSSClient() {return  new OSSClient(endpoint, new DefaultCredentialProvider(accessKeyId, accessKeySecret), new ClientConfiguration());}}

3 配置XML文件

aliyun:accessKeyId: LTxxxxxxxxaccessKeySecret: OfxxxxxxxxxxbucketName: zhyt-cmsendpoint: oss-hangzhou.aliyuncs.comurlPrefix: https://xxxx-oss-hangzhou.aliyuncs.com/

4 需要说明, 在阿里云服务配置界面, 需要把公共读权限放开,这样就可以直接使用完整路径地址直接下载文件

5 封装代码和数据表

package com.jcl.magic.service.impl;import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.model.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.jcl.magic.common.config.OssConfig;
import com.jcl.magic.common.dto.FileUploadResult;
import com.jcl.magic.common.entity.SysFiles;
import com.jcl.magic.mapper.FilesMapper;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.Resource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.List;/***  阿里云OSS 文件服务* @Classname FileUploadService* @Description TODO* @Date 2023/12/1 10:11* @Created by mingcai*/
@Service
public class FileUploadService {// 允许上传的格式private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png",".xml",".pdf",".docx",".txt"};@Autowiredprivate OSS ossClient;@Autowiredprivate OssConfig aliyunConfig;@Resourceprivate FilesMapper filesMapper;/***  上传文件,直接使用地址下载,无法预览* @author lmc* @desc 文件上传 保存数据库*/public FileUploadResult uploadSave(MultipartFile uploadFile,String key,Long userId) {// 校验文件格式boolean isLegal = false;for (String type : IMAGE_TYPE) {if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {isLegal = true;break;}}//封装Result对象,并且将文件的byte数组放置到result对象中FileUploadResult fileUploadResult = new FileUploadResult();if (!isLegal) {fileUploadResult.setStatus("error");return fileUploadResult;}//文件新路径String fileName = uploadFile.getOriginalFilename();String filePath = getFilePath(fileName);// 上传到阿里云try {// 直接下载文件,预览XML或者HTML文件ObjectMetadata meta = new ObjectMetadata();meta.setContentType("text/html");ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()),meta);//ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()));} catch (Exception e) {e.printStackTrace();//上传失败fileUploadResult.setStatus("error");return fileUploadResult;}fileUploadResult.setStatus("done");fileUploadResult.setResponse("success");SysFiles file = new SysFiles();file.setUrl(this.aliyunConfig.getUrlPrefix() + filePath);file.setOriginalFileNames(uploadFile.getOriginalFilename());file.setName(key);file.setUserId(userId);filesMapper.insert(file);//this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);fileUploadResult.setUid(file.getId());return fileUploadResult;}/*** @author lmc* @desc 文件上传*/public FileUploadResult upload(MultipartFile uploadFile) {// 校验图片格式boolean isLegal = false;for (String type : IMAGE_TYPE) {if (StringUtils.endsWithIgnoreCase(uploadFile.getOriginalFilename(), type)) {isLegal = true;break;}}//封装Result对象,并且将文件的byte数组放置到result对象中FileUploadResult fileUploadResult = new FileUploadResult();if (!isLegal) {fileUploadResult.setStatus("error");return fileUploadResult;}//文件新路径String fileName = uploadFile.getOriginalFilename();String filePath = getFilePath(fileName);// 上传到阿里云try {ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(uploadFile.getBytes()));} catch (Exception e) {e.printStackTrace();//上传失败fileUploadResult.setStatus("error");return fileUploadResult;}fileUploadResult.setStatus("done");fileUploadResult.setResponse("success");//this.aliyunConfig.getUrlPrefix() + filePath 文件路径需要保持数据库fileUploadResult.setName(this.aliyunConfig.getUrlPrefix() + filePath);fileUploadResult.setUid(System.currentTimeMillis());return fileUploadResult;}/*** @author lmc* @desc 生成路径以及文件名 例如://images/2019/04/28/15564277465972939.jpg*/private String getFileImagesPath(String sourceFileName) {DateTime dateTime = new DateTime();return "images/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");}private String getFilePath(String sourceFileName) {DateTime dateTime = new DateTime();return "drawline/" + dateTime.toString("yyyy") + "/" + dateTime.toString("MM") + "/" + dateTime.toString("dd") + "/" + System.currentTimeMillis() + RandomUtils.nextInt(100, 9999) + "." + StringUtils.substringAfterLast(sourceFileName, ".");}/*** @author lmc* @desc 查看文件列表*/public List<OSSObjectSummary> list() {// 设置最大个数。final int maxKeys = 200;// 列举文件。ObjectListing objectListing = ossClient.listObjects(new ListObjectsRequest(aliyunConfig.getBucketName()).withMaxKeys(maxKeys));List<OSSObjectSummary> sums = objectListing.getObjectSummaries();return sums;}/*** @author lmc* @desc 删除文件*/public FileUploadResult delete(String objectName) {ossClient.deleteObject(aliyunConfig.getBucketName(), objectName);FileUploadResult fileUploadResult = new FileUploadResult();fileUploadResult.setName(objectName);fileUploadResult.setStatus("removed");fileUploadResult.setResponse("success");return fileUploadResult;}/*** @author lmc* @desc 下载文件*/public InputStream exportOssFile(String objectName) {// ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。OSSObject ossObject = ossClient.getObject(aliyunConfig.getBucketName(), objectName);// 读取文件内容。InputStream is = ossObject.getObjectContent();return is;}/*** @author lmc* @desc 删除文件*/public FileUploadResult getFileUrl(String key) {if (StringUtils.isBlank(key)) {return new FileUploadResult();}SysFiles file = new SysFiles();file.setName(key);return getFileObj(file);}public FileUploadResult getFileObj(SysFiles file) {if (ObjectUtils.isEmpty(file)) {return new FileUploadResult();}FileUploadResult fileUploadResult = new FileUploadResult();LambdaQueryWrapper<SysFiles> queryWrapper = new LambdaQueryWrapper<>();if (StringUtils.isNotBlank(file.getName())) {queryWrapper.eq(true, SysFiles::getName, file.getName());}if (StringUtils.isNotBlank(file.getFileName())) {queryWrapper.eq(true, SysFiles::getFileName, file.getFileName());}if (null != file.getId()) {queryWrapper.eq(true, SysFiles::getId, file.getId());}queryWrapper.orderByDesc(SysFiles::getId);List<SysFiles> files = filesMapper.selectList(queryWrapper);if (!CollectionUtils.isEmpty(files)) {SysFiles sysFiles = files.get(0);fileUploadResult.setName(sysFiles.getUrl());}fileUploadResult.setResponse("success");return fileUploadResult;}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UVM验证平台中加入sequencer

sequence机制用于产生激励&#xff0c;它是UVM中最重要的机制之一。在 一个规范化的UVM验证平台中&#xff0c;driver只负责驱动transaction&#xff0c;而不负责产生transaction。sequence机制有两大组成部分&#xff0c;一是 sequence&#xff0c;二是sequencer。如何在验证平…

常用功能测试的检查点与用例设计思路

1 功能测试 1.1 用户登录 1.1.1 数据输入 1. 帐号或密码为空。 2. 帐号或密码长度超长。 3. 帐号或密码不符合格式要求。 4. 帐号在数据库中不存在。 5. 密码在数据库中不存在。 6. 密码在数据库中存在&#xff0c;但与帐号不匹配。 7. 正确的帐号和正确的密码。 8. …

揭秘:软件测试中Web请求的完整流程!

在软件开发的过程中&#xff0c;测试是一个至关重要的环节。而在现代互联网应用中&#xff0c;Web请求是很常见的一个测试需求。本文将介绍Web请求的完整测试流程&#xff0c;帮助读者更好地理解软件测试的关键步骤。 一、测试准备阶段 在进行Web请求测试之前&#xff0c;测试团…

创意云×四川永辉直播首秀顺利开播,vLive助力本地生活直播玩转“双12”

12月5日&#xff0c;“四川永辉超市双12特惠”直播首秀顺利开播&#xff0c;蓝海创意云为此次直播提供了虚拟场景制作和全程的技术支持。蓝海创意云使用自主研发的vLive虚拟直播系统&#xff0c;将其应用到整个直播过程中。这种独特的视觉新体验成功吸引了众多观众的关注和参与…

Java jdk和jre的区别

jdk和jre的区别为&#xff1a;JRE是java运行时环境而JDK是java开发工具包&#xff0c;JDK包含JRE&#xff0c;但是JRE可以独立安装。 JDK&#xff1a; java development kit (java开发工具)&#xff0c;JDK 是用于开发 Java 程序的最小环境。 JRE&#xff1a; java runtime e…

【动态规划】LeetCode-64.最小路径和

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

前端知识笔记(十二)———前端面试容易问到的问题总结

1.$(document).ready()方法和window.onload有什么区别&#xff1f; 执行时间不同&#xff1a;window.onload必须等到页面内的所有元素&#xff08;&#xff09;加载完毕后才能执行。 $(document).ready()是页面DOM结构绘制完毕后就执行&#xff0c;不必等到加载完毕 执行次数…

一线大厂Redis高并发缓存架构

场景1&#xff1a;秒杀库存场景&#xff0c; 10000人抢100个商品 如果用普通的分布式锁实现&#xff0c; 最后抢到的人&#xff0c;要等前面99个人抢完 优化方案&#xff1a;可用分段锁&#xff0c; 降低锁的粒度&#xff0c; 比如1-10库存用锁product:101_1,11-20库存用锁pr…

dva的学习总结

公司的项目源码用的是react和dva&#xff0c;所以我必须抓紧时间学习一下dva了&#xff0c;一天时间&#xff0c;看看我学到了什么&#xff08;dva官网DvaJS&#xff09;[这是很久之前就打算写的了&#xff0c;一直没时间&#xff0c;一直存着草稿&#xff0c;今天发出来吧] 1…

大数据量快速数据库还原程序

最近在搞数据库备份&#xff0c;备份出来的sql都十几G&#xff0c;还原的贼慢还容易报错&#xff0c;就写了个Java程序来定时还原数据库&#xff0c;我加快还原的方法是修改数据库配置&#xff0c;因此程序需要重启数据库&#xff0c;线上项目数据库不能重启的就别用了。&#…

dp-基础版动态规划(动态规划每日一题计划)10/50

最小路径和 class Solution {public static int minPathSum(int[][] grid) {int dp[][]new int[grid.length][grid[0].length];dp[0][0]grid[0][0];for(int i1;i<grid[0].length;i){dp[0][i]grid[0][i]dp[0][i-1];}for(int i1;i<grid.length;i){dp[i][0]grid[i][0]dp[i-…

江苏开放大学形成性考核 平时作业参考试题

试卷代号&#xff1a;1317 社会工作行政&#xff08;本&#xff09; 参考试题 一、单项选择题&#xff08;每题只有一个正确答案&#xff0c;请将正确答案的字母填写在括号内。每题1分&#xff0c;共8分&#xff09; 1.面对新冠肺炎疫情带来的不确定性和挑战&#xff0c;某社…

linux中slab与slub的实现区别

整体上slub的实现比slab更清爽&#xff0c;连带着方便测试和debug slab 与 slub 实现对比 SLABSLUBcpu_cache上缓存的对象以slab中的某个对象为单位&#xff0c;批发到cpu_cache上以整个slab为单位装入cpu_cache上cpu_cache结构struct array_cache struct kmem_cache_cpu 是否支…

C++红黑树封装set和map(很详细)

前言 在前面&#xff0c;我们学习了红黑树。&#xff08;没学过红黑树直接看会很吃力&#xff09;set和map的底层就是红黑树&#xff0c;现在我们要用这棵树来封装STL里面的容器&#xff1a;set和map。 下面是之前讲过的红黑树&#xff0c;他只是普通的“Key”模型,适合封装set…

BabyLIN产品如何轻松搞定K线协议实现?

来源&#xff1a;虹科汽车电子 虹科技术丨BabyLIN产品如何轻松搞定K线协议实现&#xff1f; 原文链接&#xff1a;https://mp.weixin.qq.com/s/LR7VHFQajjyw6s6bVDJmsg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 为了实现K线通信&#xff0c;SDF-V3在协议…

redis性能测试

redis性能测试 redis提供了一个性能测试工具redis-benchmark&#xff0c;可以使用redis-benchmark命令来了解redis的性能 redis-benchmark -q -c 50----------------------q 表示简化输出结果-c 50 表示有五十个客户端-n <requests> 客户端请求总量 运行结果展示了一些常…

类的加载器

文章目录 1. 类加载器的分类2. 双亲委派模型3. 沙箱安全机制 1. 类加载器的分类 口述&#xff1a;启动类加载器加载jvm需要的核心的类库&#xff0c;扩展类加载器加载外部的jar包&#xff0c;应用程序加载器加载我们自己定义的类。 2. 双亲委派模型 规定了类加载的顺序是&a…

FAQ:Reference篇

文章目录 What is a reference?What happens if you assign to a reference?What happens if you return a reference?What does object.method1().method2() mean?How can you reseat a reference to make it refer to a different object?Why does C have both pointers…

m1源码编译xgboost的动态链接库dylib

1、下载源码 git clone --recursive https://github.com/dmlc/xgboost cd xgboost拉取源码时候&#xff0c;一定要加"--recursive"这个命令。把它的字模块也要拉取下来&#xff0c;才能编译成功 2、安装c依赖 必要的依赖项(不然后续编译时报错)&#xff0c;包括CM…

用java比较两个二叉搜索树是否等价

一. 定义树的的节点 ​ 不同二叉树的叶节点上可以保存相同的值序列。例如&#xff0c;以下两个二叉树都保存了序列 1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13。 package com.wedoo.coderyeah.module.iot.algorithm;import lombok.…