s3 实现图片上传并返回图片路径

2023-10-29

一般做图片上传的的业务时我们接收的都是 MultipartFile 类型的文件 但是s3提供的图片上传只支持file 类型的文件上传,所以需要我先把 MultipartFile 转换为 file

	/**
	 * MultipartFile 转换为file
	 * 
	 * @param file
	 * @return
	 */
	public File toFile(MultipartFile file) {
		File toFile = new File(StringConstant.STATIC_NULL);
		if (file.equals(StringConstant.STATIC_NULL) || file.getSize() <= 0) {
			file = null;
		} else {
			InputStream ins = null;

			try {
				ins = file.getInputStream();
				toFile = new File(file.getOriginalFilename());
				inputStreamToFile(ins, toFile);
				ins.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return toFile;
	}

	/**
	 * 流转换为file
	 * 
	 *
	 * @param ins
	 * @param file
	 */
	public static void inputStreamToFile(InputStream ins, File file) {
		try {
			OutputStream os = new FileOutputStream(file);
			int bytesRead = 0;
			byte[] buffer = new byte[8192];
			while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
				os.write(buffer, 0, bytesRead);
			}
			os.close();
			ins.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

将文件类型转换后就需要将文件上传到s3

/**
	 * 上传文件到s3
	 * 
	 * 
	 * @param file
	 * @param key
	 * @param bukectName
	 * @param region
	 * @return
	 * @throws IOException
	 */
	public void uploadToS3(File file, String key, String bukectName,
			Regions region) throws IOException {

		long contentLength = file.length();
		long partSize = 5 * 1024 * 1024;
		try {
			AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
					.withRegion(region)
					.withCredentials(new ProfileCredentialsProvider()).build();

			List<PartETag> partETags = new ArrayList<PartETag>();

			// Initiate the multipart upload.
			InitiateMultipartUploadRequest initRequest = new InitiateMultipartUploadRequest(
					bukectName, key);
			InitiateMultipartUploadResult initResponse = s3Client
					.initiateMultipartUpload(initRequest);

			// Upload the file parts.
			long filePosition = 0;
			for (int i = 1; filePosition < contentLength; i++) {
				// Because the last part could be less than 5 MB, adjust the
				// part size as needed.
				partSize = Math.min(partSize, (contentLength - filePosition));

				// Create the request to upload a part.
				UploadPartRequest uploadRequest = new UploadPartRequest()
						.withBucketName(bukectName).withKey(key)
						.withUploadId(initResponse.getUploadId())
						.withPartNumber(i).withFileOffset(filePosition)
						.withFile(file).withPartSize(partSize);

				// Upload the part and add the response's ETag to our list.
				UploadPartResult uploadResult = s3Client
						.uploadPart(uploadRequest);
				partETags.add(uploadResult.getPartETag());

				filePosition += partSize;
			}

			// Complete the multipart upload.
			CompleteMultipartUploadRequest compRequest = new CompleteMultipartUploadRequest(
					bukectName, key, initResponse.getUploadId(), partETags);
			s3Client.completeMultipartUpload(compRequest);

		} catch (AmazonServiceException e1) {
			e1.printStackTrace();
		} catch (SdkClientException e) {
			e.printStackTrace();
		}
	}

到这为止我们就的图片就上传到 S3 啦

注意:上面的方法的参数的含义如下:

     file:就是要上传的文件

    key:就是文件的唯一标识(注意不要重复 ,如果重复会覆盖之前上传的文件)

    bukectName:就是存储桶的名称

   region:就是地区例如:Regions.US_WEST_2

但是在实际的项目中我们还需要获取到上传图片的路径进行回显,就需要执行下面的方法

	/**
	 * 生成预签名对象 URL
	 * 
	 * @author chendai
	 * @param clientRegion
	 * @param bucketName
	 * @param objectKey
	 * @return
	 */
	public String getSignatureUrl(String clientRegion, String bucketName,
			String objectKey) {
		String url = StringConstant.STATIC_NULL;

		try {
			AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
					.withRegion(clientRegion)
					.withCredentials(new ProfileCredentialsProvider()).build();

			// Set the presigned URL to expire after one hour.
			java.util.Date expiration = new java.util.Date();
			long expTimeMillis = expiration.getTime();
			// expTimeMillis += 1000 * 60 * 8640;
			long timeOut = Long.valueOf(AwsConfig.getTimeOut()).longValue();
			// expTimeMillis += 604800000;
			expTimeMillis += timeOut;
			expiration.setTime(expTimeMillis);

			// Generate the presigned URL.
			System.out.println("Generating pre-signed URL.");
			GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(
					bucketName, objectKey).withMethod(HttpMethod.GET)
					.withExpiration(expiration);
			URL fileUrl = s3Client
					.generatePresignedUrl(generatePresignedUrlRequest);

			System.out.println("Pre-Signed URL: " + fileUrl.toString());
			url = fileUrl.toString();
		} catch (AmazonServiceException e) {
			// The call was transmitted successfully, but Amazon S3 couldn't
			// process
			// it, so it returned an error response.
			e.printStackTrace();
		} catch (SdkClientException e) {
			// Amazon S3 couldn't be contacted for a response, or the client
			// couldn't parse the response from Amazon S3.
			e.printStackTrace();
		}
		return url;
	}

上面的方法生成的路径是这样的:

 https://dstech.s3.us-west-2.amazonaws.com/30212720904a4f0fbf48728453d01d10.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20190418T061044Z&X-Amz-SignedHeaders=host&X-Amz-Expires=604799&X-Amz-Credential=AKIA3CZHSC3GKUFCESSR%2F20190418%2Fus-west-2%2Fs3%2Faws4_request&X-Amz-Signature=07c46d4359a3568062aeeead185da80ca70bf67ec0b7201b7eb5e82aebddc231

红色的字代表的是它的签名 ,如果没有签名无法进行访问

签名的有效期是可以设置的但是允许设置的最长的时间为7天

至于怎么避开它的签名访问 我现在还不知道,如果有知道的可以联系我。

当然啦 还不能忘记引依赖,他们需要的依赖如下:

		<dependency>
			<groupId>org.apache.poi</groupId>
			<artifactId>poi-ooxml</artifactId>
			<version>3.11</version>
		</dependency>
		<dependency>
			<groupId>com.amazonaws</groupId>
			<artifactId>aws-java-sdk-s3</artifactId>
			<version>1.11.534</version>
		</dependency>
		<dependency>
			<groupId>software.amazon.awssdk</groupId>
			<artifactId>ec2</artifactId>
			<version>2.5.25</version>
		</dependency>
		<dependency>
			<groupId>software.amazon.awssdk</groupId>
			<artifactId>s3</artifactId>
			<version>2.5.25</version>
		</dependency>

这样可以啦

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

s3 实现图片上传并返回图片路径 的相关文章

  • Getting Started with Amazon EC2 (1 year free AWS VPS web hosting)

    from http blog coolaj86 com articles getting started with amazon ec2 1 year free aws vps web hosting html Amazon Web Ser
  • Amazon EC2 Ubuntu服务器安装图形化界面(Xfce)

    简介 Ubuntu Server是Ubuntu的不含GUI的发行版 xff0c 然而在GUI上可以获得一些工具更好的体验 本教程主要阐述如何在Amazon EC2的服务器上安装Ubuntu轻量化GUI Xfce xff0c 并通过Xrdp配
  • 使用 Amazon EC2 启动 Windows 虚拟机

    本教程将教授您如何使用 Amazon Elastic Compute Cloud EC2 来启动 配置和连接至 Windows 虚拟机 Amazon EC2 是用于在云中创建和运行虚拟机 xff08 我们将这些虚拟机称为 实例 xff09
  • S3FS:在 CentOS 和 Fedora 系统上安装 Amazon S3 存储桶

    Amazon S3 是一种高度可扩展且持久的对象存储服务 允许您从网络上的任何位置存储和检索任意数量的数据 S3FS 是 Amazon S3 的 FUSE 用户空间文件系统 接口 允许您将 Amazon S3 存储桶挂载为 CentOS 或
  • 如何重置 Amazon RDS 主用户密码

    本教程将帮助您更改或重置 Amazon RDS 主用户密码通过亚马逊网络服务控制台界面 1 登录到亚马逊网络服务安慰 2 选择需要修改密码的RDS实例 点击Modify 3 Go to Settings部分并在其中输入您的新主密码新主密码输
  • 上传图片到七牛云

    本文介绍后端如何将图片上传到七牛云 如有需要 可以参考 如有帮助 不忘点赞 预热准备 1 首先打开七牛云的官网 七牛云 2 注册一个人账号 新用户有优惠 具体可以查看官网通讯 3 进入个人控制台 打开 对象存储 gt 空间管理 然后我们新建
  • 微信小程序uploader上传文件并提交表单数据完整案例(接口框架WebAPI)

    文章目录 写在前面的话 uploader介绍 用法与代码 小程序前端 后台接口 WebAPI 采坑记录 写在前面的话 最近又自己在折腾微信小程序了 最新的一个功能中需要实现图片上传 幸运的是 微信小程序扩展能力中有现成的文件上传组件uplo
  • 亚马逊AWS免费云服务实战

    最近AWS推出了一个云服务免费使用一年的优惠 有免费的当然不能浪费咯 赶紧下手 本文重点介绍如何注册AWS的账号 以及申请使用免费云服务ES2 一台位于美国的虚拟机 话说如果是用阿里云在美国的ECS 要188RMB 月 这优惠可是杠杠的 点
  • 国茂股份全面迁移到亚马逊云科技,降本增效,驱动业务增长

    亚马逊云科技宣布 中国通用机械工业减速机行业的标杆企业江苏国茂股份有限公司 简称 国茂股份 正在全面迁移到亚马逊云科技 在中国大陆 西云数据运营宁夏区域 光环新网运营北京区域 将ERP 企业资源计划系统 APS 高级计划与排程系统 MES
  • 如何在 AWS 实例上设置 WHM 和 cPanel

    WHM cPanel 是广泛用于 Linux 托管环境的基于 Web 的系统管理控制面板 要在AWS环境上使用WHM cPanel 我们将面临正常实例的问题 因此 我们更喜欢在aws中使用VPC 虚拟私有云 来安装WHM和cPanel服务器
  • 如何在 AWS 实例中获取默认 Windows 密码

    Amazon是领先的云托管提供商 您可以从 AWS 获得任何类型的服务器 从非常小到非常大 如果您已在 AWS EC2 托管帐户中创建了 Windows Server 实例 本文将帮助您了解如何在 AWS 实例中查找 Windows Ser
  • springboot将图片上传至七牛云服务器(超详细)

    我们在公司的业务开发中 经常会接触到图片上传功能 有很多小伙伴都会在这里遇坑 特别是将图片上传至七牛云服务器上 网上的很多讲解也都很不明确 那么今天我们就要来讲一讲如何将本地的图片上传至七牛云服务器上 配合步骤自己做一个小的demo吧 本文
  • 2022亚马逊云科技中国峰会召开 宣布多项举措赋能客户数字化探索与创新

    2022年10月13日 以 自由构建 探索无限 为主题的亚马逊云科技中国峰会于今天在线上召开 在本次为期2天的峰会上 亚马逊云科技发布了云计算技术趋势展望 宣布 连中外 襄百业 携伙伴 促绿色 四大战略举措 进一步利用亚马逊云科技全球优势和
  • 安克创新与亚马逊云科技成立联合创新实验室

    日前 全球化消费电子品牌企业安克创新 Anker 正式同亚马逊云科技成立联合创新实验室 在采用亚马逊云科技服务的基础上 推动安克创新将数据分析 机器学习等服务进行规模化应用 赋能业务创新 目前 双方通过联合创新实验室在智能广告投放等领域展开
  • SpringBoot开发符合S3协议的文件存储服务

    背景 公司最近的业务大量涉及安可项目 要求避免使用第三方组件 原有开发框架支持本地文件存储 Minio 各类云存储 现在要求文件独立存储且文件服务需要自研 经调研评估后决定基于SpringBoot开发文件存储服务 使用s3协议标准 这样可以
  • 如何在AWS实例中创建和添加EBS卷

    Amazon EBS 弹性块存储 提供持久块存储以与 Amazon 实例一起使用 每个 Amazon EBS 卷都提供高可用性和持久性 它能够在其可用区中自动复制 以保护您免受组件故障的影响 本文将帮助您创建 EBS 卷并将其添加到现有实例
  • 图片压缩插件image-compressor.js的使用和解决图片旋转问题(vue)

    1 安装 yarn add image compressor js npm i image compressor js 2 引入 import ImageCompressor from image compressor js 3 使用 语法
  • 亚马逊(Amazon)公共开发者注册步骤

    亚马逊公共开发者注册步骤 持续更新 第一步 创建AWS账号 第二步 创建角色 第三步 亚马逊后台申请开发者 第一步 创建AWS账号 到AWS平台上面注册一个账号信息 资料啥的就填你自己的吧 这块操作很简单 AWS注册链接 注册完直接登录 进
  • 使用 Amazon Fault Injection Service 演示多区域和多可用区应用程序弹性

    文章作者 Jeff Amazon Fault Injection Service FIS 可帮助您将混沌工程大规模付诸实践 今天 我们推出了新的 场景 这些场景可以让您演示在亚马逊云科技可用区完全断电 或从一个亚马逊云科技区域到另一个亚马逊
  • 亚马逊自养号测评防关联技巧分享,亚马逊自养号怎么养?

    我们做亚马逊的都知道 想要做好亚马逊 测评是免不了的 很多卖家选择自养号这种方式 但是亚马逊养号并不是一件容易的事 需要我们提高养号的技术和掌握相应的技巧 而且随着平台审查力度的加强 自养号的账号关联问题也给卖家们带来许多困扰 那么什么是自

随机推荐

  • laravel 关联关系之多态关联

    多态关联 文章 作者与收藏的关联关系 收藏既可以是对文章的收藏 也可以是对作者的收藏 表 artist 字段 id name 表 article 字段 id title content 表 favorites 字段 id favorite
  • 我决定豁出去了,公开我做过的人工智能实战项目核心技术,有没有你心动的?

    前言 博主一直没有公开多少人工智能项目代码 但不少粉丝和朋友都很好奇真实人工智能项目到底是怎样的 我思前想后 打算针对几块我做过的人工智能项目给大家分享下 不过由于公司这两年发展比较快 项目方向有点多 不知道小伙伴们具体感兴趣哪块呢 欢迎大
  • UE4C++中如何申明“TSubclassOf”型数组

    之前查了查居然没人回答过 不废话 直接看代码 UPROPERTY EditDefaultsOnly TArray
  • C/C++面试:引用和指针的使用场合

    问 指针和引用作用都是间接引用其他对象 你如何决定何时使用指针 何时使用引用呢 应该使用指针的场合 有指向不存在对象的可能时 在任何情况下都不能使用指向空值的引用 一个引用必须总是指向某些对象 因此 如果你使用一个变量时并让它指向一个对象
  • 块设备、字符设备、裸设备和文件系统个人总结

    1 块设备 系统中可以随机访问 不需要按顺序 访问固定大小数据片 chunks 的设备称为块设备 这些数据片就称作块 硬盘是最常见的块设备 除此以外 还有软盘驱动器 CD ROM驱动器和闪存等 这里要注意 它们都是以安装文件系统的方式使用的
  • LeetCode Roman to Integer(罗马数字转换)

    思路 罗马数字是 阿拉伯数字传入之前使用的一种数码 罗马数字采用七个罗马字母作数字 即 1 X 10 C 100 M 1000 V 5 L 50 D 500 记数的方法 相同的数字连写 所表示的数等于这些数字相加得到的数 如 3 小的数字在
  • STC89C52系列单片机内部资源——中断系统

    中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的 中断功能的存在 很大程度上提高了单片机处理外部或者内部事件的能力 它也是单片机最重要的功能之一 是我们学习单片机必须要掌握 首先介绍单片机中断技术的优点 解决了快速主机与慢速I
  • FastGPT 接入飞书(不用写一行代码)

    FastGPT V4 版本已经发布 可以通过 Flow 可视化进行工作流编排 从而实现复杂的问答场景 例如联网谷歌搜索 操作数据库等等 功能非常强大 还没用过的同学赶紧去试试吧 飞书相比同类产品算是体验非常好的办公工具了 我司也是废了很大的
  • 操作系统学习(三)基本分段存储管理方式

    一 分段的定义 进程的地址空间按照自身的逻辑关系划分为若干段 例如 主程序 两个子程序 栈和一段数据 把进程分成5段 每段从0进行编址 段间要求连续 段内不要求 二 段表 1 分段系统的逻辑地址结构由段号 段名 和段内地址 段内偏移量 组成
  • uni-app中自定义动态底部tabbar(附示例源码)

    UNIAPP 自带的原生导航尽管流畅度非常好 但是在具体项目中有的时候需要动态设置以及特殊样式的 底部菜单 这个时候就需要自己去写一个自定义的底部tabbar 项目地址 fr uni app 1 比如需要特殊的图标 多出来一部分的 2 根据
  • 每日30条知识点-软件设计师知识点笔记

    立即寻址最快 寄存器寻址次之 直接寻址最慢 RISC 精简指令集计算机 特点 指令数量少 寻址方式少 长度固定 格式种类少 只提供load store指令访问存储器 以硬布线逻辑控制为主 单周期指令执行 系统总线用于主存以及外设部件连接 R
  • 数据结构和算法--树

    数据结构和算法是一种思想 理解了思想就是忘记了代码也能找回原来的记忆 二叉搜索树 二叉树 每个结点只存储一个关键字 等于则命中 小于走左结点 大于走右结点 AVL树 每个节点的左子树和右子树的高度最多差1的二叉搜索树 B B 树 多路搜索树
  • C++(26)——对象被优化以后才是最高效的C++编程

    对象应用优化 我们都知道 C语言和C 在程序执行中 都是通过调用一系列的函数来实现的 并且 很多时候 编译器会帮助我们做一系列的事情 比如 在编译类的成员方法的时候 编译器默认添加 this 指针 以此来确定是哪一个对象调用了该成员方法 得
  • C#上位机串口控制12864显示

    实现的效果 上面是用Proteus仿真的 对了如果自己想用proteus仿真需要安装下面这个软件 再看一下实物显示效果 先做上位机部分 为了程序一启动就把电脑上能用的串口号显示在下拉框中 private void Form1 Load ob
  • android使用Glide加载RelativeLayout、LinearLayout等背景图片

    转载请注明出处 http blog csdn net ym4189 article details 78712256 Glide框架大家应该都很熟悉 我们可以使用Glide加载网络图片 加载gif图片 使用简单 一般情况下我们都是使用Gli
  • 解决 adbd cannot run as root in production builds 问题

    这学期的一个android实验遇到的问题 经过借鉴多位大佬的文章已经解决 我的情况是android studio 不能很好的连接goole浏览器 所以不能下载其他版本 看到其他方法 https blog csdn net w69033324
  • 如何解决(变量或函数)重复定义的问题?

    错误提示 Objects light 1 axf Error L6200E Symbol gpio init multiply defined by gpio o and main o Not enough information to l
  • mongoose 实现DBRef查找所有子类信息

    产品表 var Mongoose require mongoose var Schema Mongoose Schema var Product new Schema image type String description type S
  • 【highlight】highlight 动态添加代码,样式失效

    在使用highlight 的时候 发现效果不错 然而当我用jQuery改变内容时 酷炫的高亮效果没了 原来hljs initHighlightingOnLoad 初始化的时候只会对其渲染一次 查阅资料发现 解决方案 code code 使用
  • s3 实现图片上传并返回图片路径

    一般做图片上传的的业务时我们接收的都是 MultipartFile 类型的文件 但是s3提供的图片上传只支持file 类型的文件上传 所以需要我先把 MultipartFile 转换为 file MultipartFile 转换为file