【Java】上传图片至阿里云oss服务器,文件上传以及图片base64上传

目录

  • 引入maven依赖
  • 编写ossUtil
  • 编写Controller
  • 使用接口工具进行测试
    • 测试表单文件上传
    • 测试base64文件上传

首先需要在阿里云上开通oss服务,并获取到以下四个信息

  • endpoint: 购买的服务器节点地址
  • accessKeyId: 接入的keyId
  • accessKeySecret: 接入的key秘钥
  • bucketName:桶名称,其实也就是一个文件夹

引入maven依赖

<!-- oss的SDK -->
<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

编写ossUtil

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;@Slf4j
@Component
public class OssUtil {private static final String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";private static final String accessKeyId = "xxxx";private static final String accessKeySecret = "xxxx";private static final String bucketName = "bucketName";/*** 实现上传图片到OSS* @param multipartFile file* @return 返回访问路径*/public String upload(MultipartFile multipartFile) throws Exception{// 获取上传文件的输入流InputStream inputStream = multipartFile.getInputStream();// 重命名文件,避免文件覆盖String fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")) +"-"+ multipartFile.getOriginalFilename();return upload(inputStream, fileName);}/*** 上传流到OSS* @param inputStream 输入流* @param fileName 文件名* @return 访问路径*/public String upload(InputStream inputStream,String fileName) {// 上传文件到 OSSOSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);ossClient.putObject(bucketName,fileName,inputStream);// 访问路径: https://[bucketName].[endpointHost]/fileName// 例如: https://zifeiyu01-oss.oss-cn-fuzhou.aliyuncs.com/20240220120000-1.jpgString url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;ossClient.shutdown();return url;}/*** base64转图片后上传流到OSS* @param imgData base64字符串* @return 访问路径*/public String uploadBase64(String imgData) throws Exception {//处理根据日期生成目录String dateDirPath = ResourceUtils.getURL("classpath:").getPath()+LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+"/";//生成随机文件名String fileName = UUID.randomUUID().toString().replace("-","")+".jpg";//检查目录,没有要先创建目录,不然 new FileOutputStream() 会报 FileNotFoundException异常File folder = new File(dateDirPath);if (!folder.exists()){folder.mkdirs();}//合成最后临时文件路径String imgFilePath = dateDirPath + fileName;//base64编码 转 图片(imgData:base64编码,imgFilePath:生成图片的路径)GenerateImage(imgData, imgFilePath);File file = new File(imgFilePath);InputStream inputStream = new FileInputStream(file);return upload(inputStream,fileName);}/*** base64转图片* @param imgData base64字符串* @param imgFilePath 生成的文件路径*/public static boolean GenerateImage(String imgData, String imgFilePath) throws IOException { // 对字节数组字符串进行Base64解码并生成图片System.out.println("图片数据:"+imgData);if (imgData == null) // 图像数据为空return false;FileOutputStream out = null;try {out = new FileOutputStream(new File(imgFilePath));// Base64解码byte[] b = Base64.decodeBase64(imgData);for (int i = 0; i < b.length; ++i) {if (b[i] < 0) {// 调整异常数据b[i] += 256;}}out.write(b);} catch (FileNotFoundException e) {log.error("文件未找到异常", e);} finally {if (out != null){out.flush();out.close();}return true;}}// 测试base64转图片public static void main(String[] args) throws Exception {OssUtil ossUtil = new OssUtil();String s = ossUtil.uploadBase64("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");System.out.println("访问路径:"+s);}}

编写Controller

import com.zxh.ip.dto.UploadReq;
import com.zxh.ip.utils.OssUtil;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;@RequestMapping("/upload")
@RestController
public class UploadController {@Resourceprivate OssUtil ossUtil;@PostMapping("/base64")public String upload(@RequestBody UploadReq req) throws Exception {return ossUtil.uploadBase64(req.getBase64ImgData());}@PostMapping("/file")public String upload(MultipartFile file) throws Exception {return ossUtil.upload(file);}
}
@Data
public class UploadReq {private String base64ImgData;
}

使用接口工具进行测试

测试表单文件上传

在这里插入图片描述

测试base64文件上传

在这里插入图片描述
在OSS服务也可看到图片上传成功。
在这里插入图片描述

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

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

相关文章

[计算机网络]---UDP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、端口号…

MyBatis数据库查询

文章目录 什么是MyBatisMyBatis程序的创建MyBatis实现数据库查询传参查询插入实现添加操作获取自增ID删除实现修改实现#{}和${}SQL注入 like查询 resultMap和resultType多表查询 对于普遍的后端开发而言&#xff0c;其程序主要包含了后端主程序和数据库两个部分&#xff0c;用户…

C/C++ BM11 链表相加(二)

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 总结 前言 这道题使用链表来实现加法运算&#xff0c;主要是涉及到数据对位以及加法进位的处理。 题目 假设链表中每一个节点的值都在 0 - 9 之间&#xff0c;那么链表整体就可以代表一个整数。 给定两个这种链表&#xff0…

使用C# Net6连接国产达梦数据库记录

达梦官网&#xff1a;http://www.dameng.com/ 1 下载达梦并进行安装 下载地址&#xff1a;官网首页——服务与合作——下载中心&#xff08;https://www.dameng.com/list_103.html&#xff09; 根据需要自行下载需要的版本&#xff0c;测试版本为&#xff1a;x86 win64 DM8版…

微信商户平台:如何查看超级管理员

如果有普通员工身份&#xff0c;可以登录 https://pay.weixin.qq.com/index.php/core/account/info 扫码进入后&#xff0c;进入菜单&#xff1a;账户中心》商户信息&#xff0c; 即可看到超级管理员的信息。

Windows 重启 explorer 的正确做法

目录 一、关于 Restart Manager 二、重启管理器实例 三、完整实现代码和测试 本文属于原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136179191。 我们往往使用 TerminateProcess 并传入 PID 和特殊结束代码 1 或者…

VsCode指定插件安装目录

VsCode指定插件安装目录 VsCode安装的默认目录是在用户目录(%HomePath%)下的.vscode文件夹下的extensions目录下&#xff0c;随着安装插件越来越多会占用大量C盘空间。 指定VsCode的插件目录 Vscode安装目录&#xff1a; D:\Microsoft VS Code\Code.exeVscode插件安装目录&a…

算法沉淀——递归(leetcode真题剖析)

算法沉淀——递归 01.汉诺塔问题02.合并两个有序链表03.反转链表04.两两交换链表中的节点05.Pow(x, n) 递归是一种通过调用自身的方式来解决问题的算法。在递归算法中&#xff0c;问题被分解为更小的相似子问题&#xff0c;然后通过对这些子问题的解进行组合来解决原始问题。递…

实现VLAN间通信以太网链路聚合与交换机堆叠、集群华为ICT网络赛道

10.实现VLAN间通信 10.1.使用路由器实现VLAN间通信 使用路由器物理接口 路由器三层接口作为网关&#xff0c;转发本网段前往其它网段的流量。 路由器三层接口无法处理携带VLAN Tag的数据帧&#xff0c;因此交换机上联路由器的接口需配置为Access. 路由器的一个物理接口作为一…

跨境电商无货源如何实现自动化对接1688货源商品上架?1688商品采集API来帮你

阿里巴巴集团旗下的B2B电子商务网站&#xff0c;提供海量优质商品&#xff0c;为采购商和供应商提供交流、合作、采购等服务&#xff0c;是很多没有货源优势的电商卖家首选的货源途径&#xff0c;也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要直…

优思学院|精益思想如何识别价值流?【案例分析】

精益思想是一种为了提高效率、减少浪费的管理哲学&#xff0c;精益思想强调在整个生产过程中识别并消除一切不创造价值的步骤。 价值流分析是精益思想中的一个核心概念&#xff0c;通过深入分析特定产品从原材料到最终交付给顾客的全过程&#xff0c;来识别并削减浪费&#xf…

Win11专业版安装集成了谷歌框架的安卓子系统,包含谷歌商店

1.摘要 上一篇博客讲述了使用微软商店安装安卓子系统的教程 https://blog.csdn.net/RudeTomatoes/article/details/135958882 上述方法的优点是安装过程简单&#xff0c;但是&#xff0c;由于Windows安卓子系统是微软与亚马逊联合开发&#xff0c;默认没有安装谷歌框架。我尝试…

Pytorch框架-----torch.tensor(创建张量)

文章目录 前言一、torch.Tensor二、构建tensor1.从Python的list或序列构建2.空张量3.索引和切片来获取和修改一个张量tensor中的内容 前言 torch.Tensor 是包的核心类。如果将其属性 .requires_grad 设置为 True&#xff0c;则会开始跟踪针对 tensor的所有操作。完成计算后&am…

学习总结19

# 奶牛的耳语 ## 题目描述 在你的养牛场&#xff0c;所有的奶牛都养在一排呈直线的牛栏中。一共有 n 头奶牛&#xff0c;其中第 i 头牛在直线上所处的位置可以用一个整数坐标 pi(0< pi < 10^8) 来表示。在无聊的日子里&#xff0c;奶牛们常常在自己的牛栏里与其它奶牛交…

vue3项目配置按需自动导入API组件unplugin-auto-import

场景应用&#xff1a;避免写一大堆的import&#xff0c;比如关于Vue和Vue Router的 1、安装unplugin-auto-import npm i -D unplugin-auto-import 2、配置vite.config import AutoImport from unplugin-auto-import/vite//按需自动加载API插件 AutoImport({ imports: ["…

Python学习-用Python设计第一个游戏

三、用Python设计第一个游戏 1、新建文件 使用IDLE的编辑器模式&#xff0c;新建一个文件&#xff0c;点击File—>New File 2、将下面的游戏代码敲入进去 """用Python设计第一个游戏"""temp input("不妨猜一下小甲鱼现在心里想的是…

微软和OpenAI将检查AI聊天记录,以寻找恶意账户

据国外媒体报道&#xff0c;大型科技公司及其附属的网络安全、人工智能产品很可能会推出类似的安全研究&#xff0c;尽管这会引起用户极度地隐私担忧。大型语言模型被要求提供情报机构信息&#xff0c;并用于帮助修复脚本错误和开发代码以侵入系统&#xff0c;这将很可能会成为…

Vue的个人笔记

Vue学习小tips ctrl s ----> 运行 alt b <scrip> 链接 <script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script> 插值表达式 指令

提升生产3D渲染效率与品质:挖掘渲染农场的潜力

在当今数字化时代&#xff0c;3D渲染已成为跨越多个领域不可缺少的技术&#xff0c;无论是在建筑视觉化、电影制作、互动媒体还是虚拟现实领域。随着对动态、逼真视觉效果的需求不断增长&#xff0c;3D渲染农场因其出色的运算能力和经济性成为行业中的关键解决方案。本篇文章旨…

《Solidity 简易速速上手小册》第3章:Solidity 语法基础(2024 最新版)

文章目录 3.1 变量和类型3.1.1 基础知识解析详细解析变量类型深入数据类型理解变量可见性 3.1.2 重点案例&#xff1a;创建一个简单的存储合约案例 Demo&#xff1a;编写一个简单的数字存储合约案例代码&#xff1a;SimpleStorage.sol在 Remix 中进行交互&#xff1a;拓展操作&…