Java接收并上传图片至S3,返回图片URL,并删除本地图片
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,并删除本地图片相关推荐
- c语言加载本地图片,Unity加载本地图片的2种方式
1. 使用 WWW 加载,详细查看 unity3d 官方文档. 2. 使用 System.IO 加载,lua 代码如下: local File = luanet.import_type("S ...
- android删除本地图片,Android中结合contentResolver.delete和file.delete实现本地图片的删除...
最近做的一个需求是:将拍照或相册的图片上传服务器后删除对应的本地图片.在实现这个简单的需求的过程中却碰到了两个意想不到的问题. 这两个问题源自于删除本地图片时选用的两个不同的方法 file.delet ...
- fastreport打印指定路径图片显示不出来_报表工具中图片文件怎么展示---本地图片--网络图片--数据库图片...
用于报表展示的图片来源有多种,如:数据库的图片字段.服务器本地图片.网络图片等,因此,报表工具也针对多种图片来源提供了多种多样的处理方式. 下面从不同的图片来源角度,举例介绍报表工具如何设置呈现. 图 ...
- [转载]将Excel中的图片URL地址转成图片文件
原博https://blog.csdn.net/lsg9012/article/details/77162976 前阵子从数据库中导出数据给业务,但是图片是个URL,业务需要在 Excel 中直接显示 ...
- Android 删除本地图片
以前没有写博客的习惯 换了公司之后 事情慢慢变多 也需要掌握很多的新的我不知道知识 遇到很多问题 网上各种百度 好不容易遇到可以修复bug的博客 这次用完关掉 以后遇到还需要重新百 ...
- java 删除本地图片_java如何删除
package com.data.maint; import java.io.File; import org.apache.log4j.Logger; public class ClearTempI ...
- 如何获取网络视频(或者说后台返回视频URL)第一帧图片以及获取本地视频的第一帧图片
在项目开发的时候,有可能会有这样的一种需求:有一段视频需要展示给用户,在界面上先展示视频上的某一帧图片,用户点击的时候再去获取视频资源进行播放.这时,服务器会先给我们返回视频的url,这个时候就需要通 ...
- Flutter 图片组件Image、本地图片、远程图片、图片剪切、圆形图片
1图片组件Image介绍 Flutter 中,我们可以通过 Image 组件来加载并显示图片 Image 的数据源可以是asset.文件.内存以及网络. 这里我们主要给大家讲两个 Image.asse ...
- android删除本地图片,Android之删除图库照片
相关文章:Android手机读取相册图片,根据URI获取图片路径 从图库获取的Uri:content://media/external/images/media/20782 Uri uri = dat ...
最新文章
- libc++abi.dylib: terminate_handler unexpectedly
- 基于visual Studio2013解决面试题之0601二叉树深度
- [商业]文件文件夹对比合并工具Araxis Merge
- Java中short、int、long、float、double的取值范围
- 两个栈实现一个队列与两个队列实现一个栈
- 二叉搜索树相关知识及应用操作
- .net 代码混淆原理性实践
- 2020年Java讲课笔记目录
- Java 学习总结(189)—— Java 8 功能接口使用总结
- cipher java aes 模式_java – 为什么我的AES Cipher在init的DECRYPT_MODE上抛出一个InvalidKeyException...
- 在Centos下启用mysql的远程访问账号
- 因循守旧最好:都是CPU架构,为什么你叫sw_64,而不是sw64?多别扭啊
- 使用osgeo的GDAL获取tiff文件坐标
- Nonebot QQ机器人插件八:点歌(网易云音乐)
- 建筑施工技术【22】
- matplotlib设置坐标轴颜色及画布背景色
- ISO七层模型和TCP/IP四层模型
- python pexpect安装
- 华为OD机试用Python实现 -【字母组合】(2023-Q1 新题)
- 《Seafile-搭建文件云存储平台》