Java将图片上传至S3,一般前端页面上传过来的图片,在后端接收形式都为MultipartFile,而S3不支持MultipartFile形式的文件,只支持File类型,所以需要先转换类型再上传。注意:由于上传成功后,本地或者代码运行服务器中图片也会存在,为避免这个问题,上传成功需要本地删除图片。完整代码如下:

(只需要将下面Service中开始部分的变量改成你自己的就可以直接使用)
Controller:

 //上传图片@PostMapping("/uploadPicture")public String uploadPicture(HttpServletRequest request) {MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;// 前端传过来的图片参数名为fileMultipartFile multipartFileImageFile = multipartRequest.getFile("file");return uploadService.uploadPicture(multipartFileImageFile);}

Service:

// 需要将这些变量改成你自己的,若只放到桶的根目录下,picturePath设为空
private String AWS_ACCESS_KEY = "xxxxxxxxxx";
private String AWS_SECRET_KEY = "xxxxxxxxxx";
private String region = "xxxx";
private String bucketName = "myBucket";
private String picturePath = "/picture/mypng"// 初始化连接S3
@PostConstructpublic void init() {BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(AWS_ACCESS_KEY, AWS_SECRET_KEY);s3 = AmazonS3ClientBuilder.standard().withRegion(region).withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials)).build();}public String uploadPicture(MultipartFile multipartFileTrayImageFile) {// 调用toFile方法将MultipartFile类型转换为File类型File file = toFile(multipartFileTrayImageFile);String fileUrl = "";long nowTime = System.currentTimeMillis();try {// 调用uploadToS3上传S3并获得图片URL,采用时间戳加文件名字命名,防止命名重复fileUrl = uploadToS3(file, nowTime + "_" + file.getName());// 注意!上传成功后删除,不占用本地或者服务器资源file.delete();} catch (IOException e) {e.printStackTrace();}return fileUrl;}private String uploadToS3(File tempFile, String key) throws IOException {try {String bucketPath = bucketName + floderName;//想要通过公网访问到图片,除了将桶的权限更改之外,还需要在代码中设置withCannedAcl(CannedAccessControlList.PublicRead)s3.putObject(new PutObjectRequest(bucketPath, key, tempFile).withCannedAcl(CannedAccessControlList.PublicRead));String url = cdn + key;return url;} catch (AmazonServiceException ase) {ase.printStackTrace();} catch (AmazonClientException ace) {ace.printStackTrace();}return null;}private File toFile(MultipartFile file) {File toFile = null;if ("".equals(file) || file.getSize() <= 0) {return null;} else {InputStream ins = null;try {ins = file.getInputStream();toFile = new File(file.getOriginalFilename());inputStreamToFile(ins, toFile);ins.close();} catch (IOException e) {e.printStackTrace();}}return toFile;}private 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();}}

非常方便,粘贴后,将需要改的变量修改成自己的就可以直接使用!有问题评论,看到第一时间回复。

Java接收并上传图片至S3,返回图片URL,并删除本地图片相关推荐

  1. c语言加载本地图片,Unity加载本地图片的2种方式

    1. 使用 WWW 加载,详细查看 unity3d 官方文档. 2. 使用 System.IO 加载,lua 代码如下: local File = luanet.import_type("S ...

  2. android删除本地图片,Android中结合contentResolver.delete和file.delete实现本地图片的删除...

    最近做的一个需求是:将拍照或相册的图片上传服务器后删除对应的本地图片.在实现这个简单的需求的过程中却碰到了两个意想不到的问题. 这两个问题源自于删除本地图片时选用的两个不同的方法 file.delet ...

  3. fastreport打印指定路径图片显示不出来_报表工具中图片文件怎么展示---本地图片--网络图片--数据库图片...

    用于报表展示的图片来源有多种,如:数据库的图片字段.服务器本地图片.网络图片等,因此,报表工具也针对多种图片来源提供了多种多样的处理方式. 下面从不同的图片来源角度,举例介绍报表工具如何设置呈现. 图 ...

  4. [转载]将Excel中的图片URL地址转成图片文件

    原博https://blog.csdn.net/lsg9012/article/details/77162976 前阵子从数据库中导出数据给业务,但是图片是个URL,业务需要在 Excel 中直接显示 ...

  5. Android 删除本地图片

    以前没有写博客的习惯  换了公司之后 事情慢慢变多  也需要掌握很多的新的我不知道知识   遇到很多问题  网上各种百度  好不容易遇到可以修复bug的博客   这次用完关掉   以后遇到还需要重新百 ...

  6. java 删除本地图片_java如何删除

    package com.data.maint; import java.io.File; import org.apache.log4j.Logger; public class ClearTempI ...

  7. 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片

    在项目开发的时候,有可能会有这样的一种需求:有一段视频需要展示给用户,在界面上先展示视频上的某一帧图片,用户点击的时候再去获取视频资源进行播放.这时,服务器会先给我们返回视频的url,这个时候就需要通 ...

  8. Flutter 图片组件Image、本地图片、远程图片、图片剪切、圆形图片

    1图片组件Image介绍 Flutter 中,我们可以通过 Image 组件来加载并显示图片 Image 的数据源可以是asset.文件.内存以及网络. 这里我们主要给大家讲两个 Image.asse ...

  9. android删除本地图片,Android之删除图库照片

    相关文章:Android手机读取相册图片,根据URI获取图片路径 从图库获取的Uri:content://media/external/images/media/20782 Uri uri = dat ...

最新文章

  1. libc++abi.dylib: terminate_handler unexpectedly
  2. 基于visual Studio2013解决面试题之0601二叉树深度
  3. [商业]文件文件夹对比合并工具Araxis Merge
  4. Java中short、int、long、float、double的取值范围
  5. 两个栈实现一个队列与两个队列实现一个栈
  6. 二叉搜索树相关知识及应用操作
  7. .net 代码混淆原理性实践
  8. 2020年Java讲课笔记目录
  9. Java 学习总结(189)—— Java 8 功能接口使用总结
  10. cipher java aes 模式_java – 为什么我的AES Cipher在init的DECRYPT_MODE上抛出一个InvalidKeyException...
  11. 在Centos下启用mysql的远程访问账号
  12. 因循守旧最好:都是CPU架构,为什么你叫sw_64,而不是sw64?多别扭啊
  13. 使用osgeo的GDAL获取tiff文件坐标
  14. Nonebot QQ机器人插件八:点歌(网易云音乐)
  15. 建筑施工技术【22】
  16. matplotlib设置坐标轴颜色及画布背景色
  17. ISO七层模型和TCP/IP四层模型
  18. python pexpect安装
  19. 华为OD机试用Python实现 -【字母组合】(2023-Q1 新题)
  20. 《Seafile-搭建文件云存储平台》

热门文章

  1. Go-在linux系统安装配置
  2. php900塞孔油墨_HDI树脂油墨塞孔工艺研究
  3. 中盐集团:加快推进数智化转型,引领盐行业高质量发展
  4. window 下 jdk11安装与环境变量的配置(超级详细)
  5. matlab显式差分离散,第9章期权定价的有限差分法.doc
  6. IDEA中使用Junit4进行测试的入门配置
  7. C#窗体实现的仿WIN10标准计算器
  8. 项目干系人是什么?如何有效管理项目干系人?
  9. TALIB 中文文档 Momentum Indicator Functions 动量指标函数
  10. Avue使用本地/网络数据字典