1.导入阿里云oss的jar包,maven配置如下:
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.0.2</version>
</dependency>
2.代码部分
public class AliOssClient {
private static final Logger LOGGER = LoggerFactory.getLogger(AliOssClient.class);
private String accessKeyId;
private String accessKeySecret;
private String endpoint;
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getAccessKeySecret() {
return accessKeySecret;
}
public void setAccessKeySecret(String accessKeySecret) {
this.accessKeySecret = accessKeySecret;
}
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
/**
* 上传某个Object
* @param resourceHost
* @param key
* @param inputStream
* @return
*/
public PutObjectResult putObject(String resourceHost, String key, InputStream inputStream,String contentType) {
OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
PutObjectResult result = null;
try {
// 创建上传Object的Metadata
ObjectMetadata meta = new ObjectMetadata();
// 设置文件类型
meta.setContentType(contentType);
// 上传Object.
result = client.putObject(resourceHost, key, inputStream, meta);
LOGGER.info("上传文件到oss返回result={}",result);
} catch (Exception e) {
LOGGER.error("exception threw while putObject. resourceHost={}, key={}",
resourceHost, key, e);
return result;
}
return result;
}
/**
* 获取某个Object
* @param resourceHost
* @param key
* @throws IOException
*/
public InputStream getObject(String resourceHost, String key) throws IOException{
// 初始化OSSClient
OSSClient client = new OSSClient(endpoint, accessKeyId, accessKeySecret);
InputStream objectContent = null;
try {
// 获取Object,返回结果为OSSObject对象
OSSObject object = client.getObject(resourceHost, key);
// 获取Object的输入流
objectContent = object.getObjectContent();
// 处理Object
// 关闭流
// objectContent.close();
return objectContent;
} catch (Exception e) {
LOGGER.error("exception threw while getObject. resourceHost={}, key={}, exception={}",
resourceHost, key, e);
return objectContent;
}
}
/**
* 分片上传MultipartUpload
* @param resourceHost
* @param key
* @param inputStream
* @return
*/
public String uploadFile(String resourceHost,String key,MultipartFile partFile)throws IOException {
OSSClient client = new OSSClient(this.endpoint, this.accessKeyId, this.accessKeySecret);
return multipartUpload(key,partFile,client,resourceHost);
}
private String multipartUpload(String key, MultipartFile partFile, OSSClient client, String bucketName) throws IOException {
// 开始Multipart Upload
InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest(bucketName, key);
InitiateMultipartUploadResult initiateMultipartUploadResult = client.initiateMultipartUpload(initiateMultipartUploadRequest);
final int partSize = 1024 * 1024 * 5;
// 计算分块数目
int partCount = (int) (partFile.getSize() / partSize);
if (partFile.getSize() % partSize != 0){
partCount++;
}
// 新建一个List保存每个分块上传后的ETag和PartNumber
List<PartETag> partETags = new ArrayList<>();
for(int i = 0; i < partCount; i++){
// 获取文件流
InputStream fis = partFile.getInputStream();
// 跳到每个分块的开头
long skipBytes =(long) partSize * i;
fis.skip(skipBytes);
// 计算每个分块的大小
long size = partSize < partFile.getSize() - skipBytes ?
partSize : partFile.getSize() - skipBytes;
// 创建UploadPartRequest,上传分块
UploadPartRequest uploadPartRequest = new UploadPartRequest();
uploadPartRequest.setBucketName(bucketName);
uploadPartRequest.setKey(key);
uploadPartRequest.setUploadId(initiateMultipartUploadResult.getUploadId());
uploadPartRequest.setInputStream(fis);
uploadPartRequest.setPartSize(size);
uploadPartRequest.setPartNumber(i + 1);
UploadPartResult uploadPartResult = client.uploadPart(uploadPartRequest);
// 将返回的PartETag保存到List中。
partETags.add(uploadPartResult.getPartETag());
// 关闭文件
fis.close();
}
CompleteMultipartUploadRequest completeMultipartUploadRequest =
new CompleteMultipartUploadRequest(bucketName,key, initiateMultipartUploadResult.getUploadId(), partETags);
// 完成分块上传
CompleteMultipartUploadResult completeMultipartUploadResult =
client.completeMultipartUpload(completeMultipartUploadRequest);
// 获得地址
return completeMultipartUploadResult.getKey();
}
}
3.外部如何调用
一般 Constants.RESOURCE_PATH=“http://test.baidu.com/”作为前缀一般会配在数据库里面,而key作为规则路径,可自己匹配规则,a/uuid/n.pdf之类的;然后根据 url=Constants.RESOURCE_PATH + key 来取资源。
public class Test {
public static void main(String[] args) throws IOException {
//application/pdf
AliOssClient client = new AliOssClient();
client.setAccessKeyId("aliyun oss的鉴权id");
client.setAccessKeySecret("aliyun oss的鉴权秘钥");
client.setEndpoint("aliyun oss地址");
// 1.上传pdf到OSS
InputStream inputStream = null;
//TODO 得到pdf输入流
PutObjectResult result = client.putObject("http://www.aliyun.com/ad", "/qwew/qwe1/1.pdf", inputStream, "application/pdf");
// 其中 url = http://www.baidu.com/ad + /qwew/qwe1/1.pdf就是下载地址
System.out.println("下载url是"+"http://www.aliyun.com/ad/qwew/qwe1/1.pdf");
// 2.从OSS下载pdf
InputStream in = client.getObject("http://www.aliyun.com/ad", "/qwew/qwe1/1.pdf");
//TODO 将流转化为pdf保存到文件或者flush到页面,在页面下载
}
}