之前整理过spring整合amazonS3的博客,也整理过遇到的问题和文档。今天整理下springboot项目下如何使用amazonS3,并且如果是封装接口的话,是怎样的?

1.项目结构

2.在pom.xml中引入amazonS3的依赖。这一个就行

        <dependency><groupId>com.amazonaws</groupId><artifactId>aws-java-sdk-s3</artifactId><version>1.11.490</version></dependency>

3.controller接口层

package com.zhanglf.controller;import com.zhanglf.common.result.CodeMsg;
import com.zhanglf.common.result.Result;
import com.zhanglf.common.util.ParamUtil;
import com.zhanglf.common.util.RequestUtil;
import com.zhanglf.exception.BizException;
import com.zhanglf.model.OssFileModel;
import com.zhanglf.service.OssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletRequest;
import java.util.Map;/*** @author zhanglf* @Description 对象存储controller*/
@RestController
@RequestMapping("/amazonS3")
@Slf4j
public class AmazonController {/** 云存储中的测试数据目录,不允许删除 */final String DEMO = "/demo";@AutowiredAmasonService amazonService;/*** @Description 文件上传云存储* @Param [file, params]* @return com.zhanglf.common.result.Result<com.zhanglf.model.AmazonFileModel>*/@PostMapping(value = "/upload")public Result<AmazonFileModel> upload(@RequestParam("file") MultipartFile file,  @RequestParam("params") String params,    HttpServletRequest request){AmazonFileModel amazonFileModel= null;try{Map<String,String> map = ParamUtil.parseAndRequire(params,"uid");String uid = map.get("uid");amazonFileModel= amazonService.upload(file,uid);log.info("IP:[{}],用户:[{}]上传了文件:[{}]", RequestUtil.getRequestIP(request),uid,amazonFileModel.getFilePath());}catch (BizException e){log.error("上传云存储BizException",e.getCause());return Result.error(e.getCodeMsg());}catch (Exception e){log.error("上传云存储Exception",e.getCause());return Result.error(CodeMsg.SERVER_ERROR.fillArgs(e.getMessage()));}return Result.success(amazonFileModel);}

4.服务层和服务接口层

package com.zhanglf.service;import com.zhanglf.model.AmazonFileModel ;
import org.springframework.web.multipart.MultipartFile;
/**** @Author zhanglf* @Description 云存储接口*/
public interface AmasonService {/*** @Description 文件上传* @Param [file, uid]* @return com.zhanglf.model.AmazonFileModel */AmazonFileModel upload(MultipartFile file,String uid);}package com.zhanglf.service.impl;import com.amazonaws.AmazonServiceException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.SDKGlobalConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectResult;
import com.zhanglf.common.result.CodeMsg;
import com.zhanglf.common.util.Md5Util;
import com.zhanglf.common.util.StringUtil;
import com.zhanglf.exception.BizException;
import com.zhanglf.model.AmazonFileModel ;
import com.zhanglf.service.AmazonService ;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import javax.annotation.PostConstruct;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;/*** @Description 云存储业务层实现*/
@Service
public class AmazonServiceImpl implements AmazonService {/** bucket */final String bucketName = "zhanglf-bucket";/** accessKey */final String accessKey = "6585CEFDFDDB3RC380CG68F0207552G9";/** secretKey */final String secretKey = "72363F620A571BD4D12WD0A3655EC8G0";/** endpoint */final String endpoint = "https://s3.cn-north-1.tainiu.com";/** aws s3 client */AmazonS3 s3 = null;@Overridepublic AmazonFileModel upload(MultipartFile file, String uid) {String tempFileName = Md5Util.md5(uid+file.getOriginalFilename()+System.currentTimeMillis())+"."+ StringUtil.getSuffix(file.getOriginalFilename());String originalFileName = file.getOriginalFilename();String contentType = file.getContentType();long fileSize = file.getSize();String dateDir = new SimpleDateFormat("/yyyy/MM/dd").format(new Date());String tempBucketName = bucketName+dateDir;String filePath = dateDir+"/"+tempFileName;ObjectMetadata objectMetadata = new ObjectMetadata();objectMetadata.setContentType(contentType);objectMetadata.setContentLength(fileSize);try {PutObjectResult putObjectResult = s3.putObject(tempBucketName, tempFileName, file.getInputStream(), objectMetadata);} catch (AmazonServiceException e) {throw new BizException(CodeMsg.AMAZON_ERROR.fillArgs(e.getErrorMessage()));} catch (IOException e) {throw new BizException(CodeMsg.AMAZON_ERROR.fillArgs(e.getMessage()));}AmazonFileModel amazonFileModel = new AmazonFileModel ();amazonFileModel .setFileName(originalFileName);amazonFileModel .setFileSize(fileSize);amazonFileModel .setFileType(contentType);amazonFileModel .setFilePath(filePath);amazonFileModel .setUrl("http://zhanglf-bucket.s3.cn-north-1tainiu.com"+filePath);return amazonFileModel ;}@PostConstructpublic void init(){ClientConfiguration config = new ClientConfiguration();AwsClientBuilder.EndpointConfiguration endpointConfig =new AwsClientBuilder.EndpointConfiguration(endpoint, "cn-north-1");AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey,secretKey);AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);s3  = AmazonS3Client.builder().withEndpointConfiguration(endpointConfig).withClientConfiguration(config).withCredentials(awsCredentialsProvider).disableChunkedEncoding().withPathStyleAccessEnabled(true).build();}
}

5.相关的实体类

package com.zhanglf.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** @author zhanglf* @Description 云存储文件模型*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AmazonFileModel {/** 文件大小 */private long fileSize;/** 文件名称 */private String fileName;/** 文件URL */private String url;/** 云存储中的路径 */private String filePath;/** 文件类型 */private String fileType;
}package com.zhanglf.common.result;import lombok.AllArgsConstructor;
import lombok.Getter;/*** @author zhanglf* @date 2019-02-15*/
@AllArgsConstructor
@Getter
public class Result<T> {/*** 返回代码*/private int code;/*** 返回消息*/private String msg;/*** 返回数据*/private T data;/*** 成功时候的调用* */public static <T> Result<T> success(T data){return new  Result<T>(0,"success",data);}/*** 成功时候的调用* */public static Result success(){return new  Result(0,"success",null);}/*** 失败时候的调用* */public static <T> Result<T> error(CodeMsg codeMsg){if(codeMsg == null) {return null;}return new Result<T>(codeMsg.getCode(),codeMsg.getMsg(),null);}
}package com.zhanglf.exception;import com.zhanglf.common.result.CodeMsg;
import lombok.AllArgsConstructor;
import lombok.Data;/**
* @Description 自定义业务异常,集成自RuntimeException
* @author zhanglf
* @date 2019/02/03
*/
@AllArgsConstructor
@Data
public class BizException extends RuntimeException{/** 错误码对象 */private CodeMsg codeMsg;/*** @Description 带动态参数的构造方法* @Param* @return*/public BizException(CodeMsg codeMsg,String... args){this.codeMsg = codeMsg.fillArgs(args);}}package com.zhanglf.common.result;import lombok.Getter;/**
* @Description CodeMsg
* @author zhanglf
*/
@Getter
public class CodeMsg {//通用信息/** 成功 */public static CodeMsg SUCCESS = new CodeMsg(0, "success");/** 服务器异常 */public static CodeMsg SERVER_ERROR = new CodeMsg(500000,"服务端异常:%s");/** 参数校验异常 */public static CodeMsg BIND_ERROR = new CodeMsg(500001,"参数校验异常:%s");/** 传入参数为空 */public static CodeMsg PARAMS_IS_EMPTY = new CodeMsg(500002,"传入参数为空:%s");/** 参数解析失败 */public static CodeMsg PARAMS_PARSE_ERROR = new CodeMsg(500003,"参数解析失败:%s");//登录模块 5001XX/** 账号不存在 */public static CodeMsg ACCOUNT_NOT_EXIST = new CodeMsg(500100,"账号不存在:%s");/** 账号已存在 */public static CodeMsg ACCOUNT_EXISTS = new CodeMsg(500101,"账号已存在:%s");/** 密码不正确 */public static CodeMsg PASSWORD_ERROR = new CodeMsg(500102,"密码不正确:%s");//权限模块 5002XX//云中间件模块 5003XX/** 云存储异常 */public static CodeMsg OSS_ERROR = new CodeMsg(500300,"云存储异常:%s");/*** 参数为空*/public static CodeMsg PARAM_EMPTY = new CodeMsg(400001,"参数:%s不能为空!");/*** 表中已经存在该字段*/public static CodeMsg FIELD_EXIST = new CodeMsg(400002,"%s");/*** 状态为已发布*/public static CodeMsg PUBLIC_STATUS = new CodeMsg(400003,"状态为已发布,不允许修改或删除操作!");//执行数据库操作异常模块  5004XX/**执行新增时数据库异常*/public static CodeMsg MYSQL_INSERT_EXCEPTION = new CodeMsg(500401,"执行新增时数据库异常:%s");/**执行修改时数据库异常*/public static CodeMsg MYSQL_UPDATE_EXCEPTION = new CodeMsg(500402,"执行修改时数据库异常:%s");/**执行删除时数据库异常*/public static CodeMsg MYSQL_DELETE_EXCEPTION = new CodeMsg(500403,"执行删除时数据库异常:%s");/**执行查询时数据库异常*/public static CodeMsg MYSQL_QUERY_EXCEPTION = new CodeMsg(500404,"执行查询时数据库异常:%s");/**执行批量插入时插入条数小于入参条数*/public static CodeMsg MYSQL_BATCH_INSERT_EXCEPTION = new CodeMsg(500405,"批量插入数量不对:%s");/**数据状态不允许进行某些操作*/public static CodeMsg STATUS_ERROR = new CodeMsg(500406,"%s");/** 返回码 */private int code;/** 返回信息 */private String msg;/** 无参构造方法 */private CodeMsg() {}/** 构造方法 */private CodeMsg(int code, String msg) {this.code = code;this.msg = msg;}/** 填充动态参数 */public CodeMsg fillArgs(Object... args) {int code = this.code;String message = String.format(this.msg, args);return new CodeMsg(code, message);}
}

6.接口请求测试:postman

接口请求返回值:

{"code": 0,"msg": "success","data": {"fileSize": 35,"fileName": "aa.txt","url": "http://zhanglf-bucket.s3.cn-north-1.zhanglf.com/2019/04/03/0d0efd0c62391177cf6e97bdf91ea194.txt","filePath": "/2019/04/03/0d0efd0c62391177cf6e97bdf91ea194.txt","fileType": "text/plain"}
}

springboot整合amazonS3,封装上传文件接口相关推荐

  1. 关于使用Karate-实现上传文件接口测试方法总结

    在API接口自动化测试过成中,经常会遇到上传文件的接口,那么在Karate框架中如何实现上传文件接口的自动化哪?今天我就将个人积累的小经验分享给大家: [如果大家对karate还不熟悉,请参考我之前的 ...

  2. Python请求上传文件接口

    Python 请求上传文件接口 def post_multipart_request():params = {"key1": "value1", "k ...

  3. springboot调用python脚本_Springboot实现上传文件接口,使用python的requests进行组装报文上传文件的方法...

    记录瞬间 近段时间使用Springboot实现了文件的上传服务,但是在使用python的requests进行post上传时,总是报错. 比如: 1.Current request is not a m ...

  4. python调用接口上传文件_python上传文件接口

    文件的参数组装: ('文件名',"open打开的文件(rb模式打开)",'文件的类型说明') 关于不同的请求参数类型,使用requests的处理: 1.文件上传(Content-T ...

  5. springboot集成阿里OSS上传文件

    开发前的准备: 自己在阿里云上申请免费的Oss对象存储,新建Bucket---读写权限选择公共读,我开始这里忘了导致后来踩了小坑 接下来是代码中的一些配置:我用的是springboot 1>添加 ...

  6. 后端实现上传文件接口,并使用阿里云的oss对象存储

    在阿里云搜索对象存储oss,开通并进入到控制台 进入到控制台后,选择bucket列表然后创建bucket,bucket就类似文件夹 然后如果没有accesskey的要先创建,在右上角头像处 接下来就该 ...

  7. java整合七牛云上传文件

    七牛云存储 七牛云(隶属于上海七牛信息技术有限公司)是国内领先的以视觉智能和数据智能为核心的企业级云计算服务商,同时也是国内知名智能视频云服务商,累计为 70 多万家企业提供服务,覆盖了国内80%网民 ...

  8. Postman调用上传文件接口提示Error: read ECONNRESET

    问题现象:Postman上传文件时,接口提示Error: read ECONNRESET 解决办法:上传的文件名不能是中文,换成英文试试 问题原因:未知

  9. nodejs + express + multiparty处理上传文件接口:踩坑及总结

    文章目录 一.简单的文件上传 模块 接口 二.multipart/form-data随着表单上传文件 前端 后端 1. multiparty 2.connect-multiparty 在平时工作和自己 ...

最新文章

  1. 【译】缓存最佳实践 max-age的陷阱
  2. linux 批量删除
  3. CSS hack浏览器兼容一览表
  4. 报错后返回输入参数的界面
  5. python celery多worker、多队列、定时任务
  6. 实例变量 成员变量 java 1615135036
  7. php git server,server.php
  8. 树与森林的概念与性质
  9. Web实践小项目(仅供参考)
  10. linux中kvm配置文件,linux操作系统内配置vlan+kvm虚拟机
  11. 基于NLTK的命名实体识别(分词、词性标注) 及windows系统64位—在python3下安装nltk
  12. Java考试题30道(附答案)
  13. 云计算IaaS核心技术全景指南
  14. CentOS7.0+phpwind9.0.1环境搭建
  15. 极大似然估计法的理解
  16. 皮皮虾如何去水印视频
  17. 使用wangeditor遇到的坑,插入视频只显示音频
  18. Wi-Fi当前的趋势及对IT和物联网的影响
  19. 比较两组数据的差异用什么图更直观_科研数据可视化:巧妙运用各种形式的图表...
  20. 3GPP TS 23502-h20 中英文对照 | 4.4.1.3 N4 Session Modification procedure

热门文章

  1. Python PyInstaller安装和使用教程(详解版)
  2. 感觉到压力和任务艰巨
  3. 关于discuz的fap.php 漏洞问题
  4. fgo服务器维护补偿,fgo命运冠位指定活动维护公告 12月2日更新
  5. RK3399平台开发系列讲解(系统修改记录篇)1.7、安卓系统去除USB权限弹窗
  6. 谷歌浏览器被hao123霸占首页的简单解决方法
  7. 概率统计相关基础知识
  8. ubuntu加了张固态_Ubuntu如何优化ssd?
  9. Unity Shader 做一个简单的波浪 屏幕扭曲
  10. Flex皮肤设计简单实例教程