赞
踩
amazon (S3) 是一个公开的服务,Web 应用程序开发人员可以使用它存储数字资产,包括图片、视频、音乐和文档。 S3 提供一个 RESTful API 以编程方式实现与该服务的交互。(来源百度百科)
简单来说就是所有支持S3协议的都可以使用这个进行文件上传或者下载等操作。
本文使用开源的MinIO进行演示
搭建按照官方操作即可
搭建完成之后需要创建一个用户
拿到对应的信息
<!-- aws-java-sdk-s3 -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.12.362</version>
</dependency>
<!-- commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
在配置文件中添加配置
一个是S3的配置,一个是文件上传文件大小限制
#AWS S3配置
aws:
s3:
accessKey: 配置的信息
secretKey: 配置的信息
url: http://你的ip:端口
bucket: 桶名称
# 文件上传限制
spring:
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
@Data
@Configuration
@ConfigurationProperties(prefix = "aws.s3")
public class AwzS3Config {
private String accessKey;
private String secretKey;
private String url;
private String bucket;
}
@Component public class AwzS3Util { @Resource private AwzS3Config injectAwzS3Config; private static AwzS3Config awzS3Config; private static AmazonS3 amazonS3; @PostConstruct public void init() { awzS3Config = this.injectAwzS3Config; AWSCredentials credentials = new BasicAWSCredentials(awzS3Config.getAccessKey(), awzS3Config.getSecretKey()); AWSCredentialsProvider credentialsProvider = new AWSStaticCredentialsProvider(credentials); AwsClientBuilder.EndpointConfiguration endpointConfig = new AwsClientBuilder.EndpointConfiguration(awzS3Config.getUrl(), Regions.CN_NORTH_1.getName()); ClientConfiguration config = new ClientConfiguration(); config.setSignerOverride("S3SignerType"); config.setProtocol(Protocol.HTTP); config.withUseExpectContinue(false); config.disableSocketProxy(); amazonS3 = AmazonS3Client.builder() .withEndpointConfiguration(endpointConfig) .withClientConfiguration(config) .withCredentials(credentialsProvider) .disableChunkedEncoding() .withPathStyleAccessEnabled(true) .withForceGlobalBucketAccessEnabled(true) .build(); } /** * 创建桶 * * @return boolean * @params * @param bucket * @author susj * @date 2022/12/12 16:39 */ public static boolean createBucket(String bucket) { if (StringUtils.isNullOrEmpty(bucket)) { throw new IllegalArgumentException("桶名称不能为空!"); } try { amazonS3.createBucket(bucket); } catch (SdkClientException e) { e.printStackTrace(); return false; } return true; } /** * 删除桶 * * @return boolean * @params * @param bucket * @author susj * @date 2022/12/12 16:39 */ public static boolean deleteBucket(String bucket) { if (StringUtils.isNullOrEmpty(bucket)) { throw new IllegalArgumentException("桶名称不能为空!"); } try { amazonS3.deleteBucket(bucket); } catch (SdkClientException e) { e.printStackTrace(); return false; } return true; } /** * 上传文件 * * @param bucket 桶名称 * @return boolean * @params * @param file * @author susj * @date 2022/12/12 16:33 */ public static boolean upload(MultipartFile file, String bucket) { if (Objects.isNull(file)) { throw new IllegalArgumentException("文件不能为空!"); } String fileName = file.getOriginalFilename(); ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentType(file.getContentType()); objectMetadata.setContentLength(file.getSize()); bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket; try { PutObjectRequest request = new PutObjectRequest(bucket, fileName, file.getInputStream(), objectMetadata) // 设置文件访问权限 .withCannedAcl(CannedAccessControlList.BucketOwnerFullControl); PutObjectResult result = amazonS3.putObject(request); } catch (IOException e) { e.printStackTrace(); return false; } return true; } /** * 通过文件名称下载 * * @param fileName * @return org.springframework.http.ResponseEntity<byte [ ]> * @params * @param bucket * @author susj * @date 2022/12/12 16:56 */ public static ResponseEntity<byte[]> downloadByName(String bucket, String fileName) throws IOException { if (StringUtils.isNullOrEmpty(bucket)) { throw new IllegalArgumentException("文件名称不能为空!"); } bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket; GetObjectRequest getObjectRequest = new GetObjectRequest(bucket, fileName); S3Object s3Object = amazonS3.getObject(getObjectRequest); S3ObjectInputStream objectInputStream = s3Object.getObjectContent(); byte[] bytes = IOUtils.toByteArray(objectInputStream); // 替换中文 String showFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20"); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); httpHeaders.setContentLength(bytes.length); httpHeaders.setContentDispositionFormData("attachment", showFileName); return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK); } /** * 删除单个文件 * * @param fileName * @return boolean * @params * @param bucket * @author susj * @date 2022/12/12 17:04 */ public static boolean deleteFile(String bucket, String fileName) { if (StringUtils.isNullOrEmpty(fileName)) { throw new IllegalArgumentException("文件名称不能为空!"); } bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket; try { amazonS3.deleteObject(bucket, fileName); } catch (SdkClientException e) { e.printStackTrace(); return false; } return true; } /** * 获取文件信息 * * @param fileName * @return com.amazonaws.services.s3.model.ObjectMetadata * @params * @param bucket * @author susj * @date 2022/12/12 17:08 */ public static ObjectMetadata getFileInfo(String bucket, String fileName) { if (StringUtils.isNullOrEmpty(fileName)) { throw new IllegalArgumentException("文件名称不能为空!"); } bucket = StringUtils.isNullOrEmpty(bucket) ? awzS3Config.getBucket() : bucket; ObjectMetadata objectMetadata = null; try { objectMetadata = amazonS3.getObjectMetadata(bucket, fileName); } catch (SdkClientException e) { e.printStackTrace(); } return objectMetadata; } }
@RestController @RequestMapping("awz/s3") public class S3Controller { @PostMapping(value = "/uploadObject") public ResponseEntity uploadObject(MultipartFile file, String bucket) { try { AwzS3Util.upload(file, bucket); } catch (Exception e) { e.printStackTrace(); } return new ResponseEntity("上传成功!", HttpStatus.OK); } @PostMapping(value = "/downloadObject") public ResponseEntity downloadObject(String bucket, String fileName) { ResponseEntity<byte[]> download = null; try { download = AwzS3Util.downloadByName(bucket, fileName); } catch (Exception e) { e.printStackTrace(); } return download; } @PostMapping(value = "/getFileInfo") public ObjectMetadata getFileInfo(String bucket, String fileName) { return AwzS3Util.getFileInfo(bucket, fileName); } }
上传成功在管理页面也看到了文件
下载成功
https://gitee.com/xyzissj/minio.git
这里只是简单封装一下,具体实际使用需要根据实际需求处理
这边网上有一个个人的开源项目:X Spring File Storage
由于是个人的开源项目,所以是否使用请自己甄别,如有任何问题与本人无关。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。