java使用AWS S3 SDK 上传文件至 DigitalOcean Spaces

标签: java DigitalOcean Spaces aws
1142人阅读 评论(0) 收藏 举报
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Date;
import java.util.Properties;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder.EndpointConfiguration;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
import com.amazonaws.services.s3.model.PutObjectRequest;

/**
 * 与云存储服务 digitalocean spaces 通信工具类 
 * 使用 AWS S3 的SDK
 * 
 * 20180131
 * @author fengshi
 * @version 1.0
 */
public class AWSS3Util {
	
	private static final String CONTENT_TYPE_SVG = "image/svg+xml";   
	
    private static String downloadUrl;
    private static String bucketName;   
    
	private static AWSS3Util awsS3Util;
	private static AmazonS3 s3;
	private static ObjectMetadata metadata;
	
	private AWSS3Util(){
		
	}
    
    /**
     * 上传公有文件
     * 
     * @param filePath		待上传文件路径
     * @param key			该文件在bucket中的文件名
     * @param isPub			是否公有
     * @return String		文件访问url
     * @throws FileNotFoundException
     */
    public String putObject(String filePath, String key, boolean isPub) throws FileNotFoundException{
    	return putObject(new File(filePath), key, isPub);
    }
    
    /**
     * 
     * @param file		待上传文件
     * @param key		该文件在bucket中的文件名
     * @param isPub		上传文件是否公有
     * @return String	文件访问url
     * @throws FileNotFoundException
     */
    public String putObject(File file, String key, boolean isPub) throws FileNotFoundException{
    	return putObject(new FileInputStream(file), key, isPub);
    }
    
    /**
     * @param inputStream		待上传文件流
     * @param key				该文件在bucket中的文件名
     * @param isPub				上传文件是否公有
     * @return String			文件访问url
     * @throws FileNotFoundException
     */
    public String putObject(InputStream inputStream, String key, boolean isPub) throws FileNotFoundException{
    	PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream, metadata);
    	if(isPub) request.setCannedAcl(CannedAccessControlList.PublicRead);
    	s3.putObject(request);
    	return isPub ? new StringBuffer().append(downloadUrl).append(key).toString() : getPublicURL(key, null);
    }
    
    /**
     * 获取文件公有链接
     * 
     * @param key				该文件在bucket中的文件名
     * @param expirationDate 	设置过期时间 无过期时间传null
     * @return
     */
    public String getPublicURL(String key, Date expirationDate){
        GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(bucketName, key);  
        if (null != expirationDate) urlRequest.setExpiration(expirationDate);
        return s3.generatePresignedUrl(urlRequest).toString();
    }
    
    public static AWSS3Util getInstance(){
		if(awsS3Util == null){
			synchronized (AWSS3Util.class){
				if (awsS3Util == null) {
					awsS3Util = new AWSS3Util();
					Properties pro = PropertiesUtils.getProperties();
					s3 = AmazonS3ClientBuilder.standard()
			                .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(pro.getProperty("aws.accessKey"), pro.getProperty("aws.secretKey"))))
			                .withEndpointConfiguration(new EndpointConfiguration(pro.getProperty("aws.endpointUrl"), pro.getProperty("aws.region")))
			                .build();
					metadata = new ObjectMetadata();
					metadata.setContentType(CONTENT_TYPE_SVG);//目前只用于上传svg v1.0
					downloadUrl = pro.getProperty("aws.downloadUrl");
					bucketName = pro.getProperty("aws.bucketName");
				}
			}
		}
		return awsS3Util;
	}
}
<dependency>
	<groupId>com.amazonaws</groupId>
	<artifactId>aws-java-sdk</artifactId>
	<version>1.11.257</version>
</dependency>

关于创建连接时几个参数的对应关系:

这是我在DigitalOcean Spaces网页后台上传的文件生成的地址

https://hachi.ams3.digitaloceanspaces.com/batik_test10.svg

hachi是bucketName

region是ams3

endpointUrl是ams3.digitaloceanspaces.com

accessKey和secretKey去DigitalOcean Spaces创建

比较坑的是secretKey只在第一次创建accessKey时能看到 我创建第一个accessKey的时候没注意找了好久secretKey





查看评论

AWS S3 API实现文件上传下载

近日项目需要使用AWS S3的API实现文件的上传和下载功能,才发现网上关于.net实现该功能的文章不多,有几篇也都是很老版本的AWS的使用描述了,写法和封装的类等等都基本上报废了。虽然这样,但还是很...
  • marvin198801
  • marvin198801
  • 2015-08-14 16:35:30
  • 20163

一说就懂的 AWS S3

一说就懂的AWS S3,用简单语言介绍了AWS S3的功能和性能。
  • keithyau
  • keithyau
  • 2016-01-06 15:24:03
  • 13618

java使用AWS S3 SDK 上传文件至 DigitalOcean Spaces

import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja...
  • www359956085
  • www359956085
  • 2018-02-02 10:35:07
  • 1142

实现 Amazon S3 数据(文件)分段上传

探索是否能以流式写数据到 S3 通常,在我们项目中用 Java 代码上传数据到 S3 是下面那样的操作 AmazonS3 s3Client = AmazonS3ClientBuilde...
  • kypfos
  • kypfos
  • 2017-12-12 16:24:09
  • 640

AWS S3 API实现文件上传下载(ASP.NET MVC)

近日项目需要使用AWS S3的API实现文件的上传和下载功能,发现网上很多都是Java版本的,.NET版本很少,其中遇到了几个小问题,在这里写一下方便以后大家开发。     1、首先加入配置,其中标...
  • qq_24033949
  • qq_24033949
  • 2016-12-15 15:34:57
  • 1798

AWS EC2上传文件到S3(python boto)

1.获得所有存储桶 >>>import boto.s3.connection >>>conn=boto.s3.connect_to_region('cn-north-1') >>>conn.get_...
  • yuan13091324
  • yuan13091324
  • 2016-01-15 15:27:52
  • 1954

Amazon S3 实现文件上传的api以及样例

  • 2011年02月22日 22:37
  • 10.73MB
  • 下载

AWS s3 文件上传,下载(Android demo),类似minio

  • 2017年05月12日 15:59
  • 19.11MB
  • 下载

AmazonS3 使用 AWS SDK for Java

Amazon S3是一种云上的存储服务器,其功能仅在于存储。和普通的服务器不同,它没有操作界面,连一般的SSH命令登录功能都没有。和它打交道的话,一种办法是用它的管理界面,另一种是借助其编程接口。Am...
  • u012147490
  • u012147490
  • 2016-11-09 11:06:25
  • 2434

AWS的s3存储的java实现-gradle构建环境

将开发工具包与 Gradle 一起使用,要在 Gradle 项目中使用适用于 Java 的 AWS 开发工具包,请使用 Spring 的适用于 Gradle 的依赖项管理插件,使用该插件,可以导入开发...
  • wanglong1990421
  • wanglong1990421
  • 2017-07-13 16:00:09
  • 1394
    个人资料
    等级:
    访问量: 1237
    积分: 53
    排名: 167万+
    文章分类
    文章存档