给阿里云上传内容(图片、视频、word等等)。
首先需要引入阿里云提供的包,然后就可以使用阿里云oss提供的api进行操作。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
首先需要新建一个OSSClient控制端,客户端需要三个参数。
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
endpoint是在oss管理控制台新建Bucket时,选择的地区。
accessKeyId和accessKeySecret属于用户,在管理控制台可以看到accessKeyId。只有在用户第一次被创建的时候,才可以看到accessKeySecret。
oss的访问控制RAM有四个步骤:管理授权策略、创建群组并授权、创建用户并加入群组、完成授权。
例:我建了一个群组,并且创建了一个用户加入了群组,所以用户获得了群组的权限。
群组权限有:管理对象存储服务(OSS)权限、只读访问对象存储服务(OSS)的权限等等,很多。常用的是管理对象存储服务(OSS)权限。
ossClient.putObject(bucketName, fileKey, inputStream);
其中fileKey可以包含路径,比如:test/liuyifei.jpg
Bucket在创建时,有三种权限可供选择,私有、公共读、公共读写。公共读在访问的时候不需要签名,直接就能访问,比如:https://.oss-cn-hangzhou.aliyuncs.com/test/liuyifei.jpg
而私有的Bucket必须要对每个对象进行操作,然后生成访问链接。
URL url = ossClient.generatePresignedUrl(bucketName, fileKey, cal.getTime());
其中cal.getTime()是链接有效时间,在有效时间内,才能访问。
https://.oss-cn-beijing.aliyuncs.com/liuyifei.jpg?Expires=1533181470&OSSAccessKeyId=TMP.AQHlFjL73rTJ7p48ozPpDtL56I4Gijr3kIzLTtyNz9KLixH5rRvqoY6MgaHWAAAwLAIUGZBw077mmE1lkNIE7_SV5TynAKgCFHcqZZu463KN0XZVnd3KiEZ-AV1&Signature=jyexaAsqBs2RE%2FqfwrMwdVOTYE%3D
这种就是私有Bucket的api。
我写的方法,在上传图片时,顺带也就生成访问链接(默认给的有效时间为十年)。
上传图片和根据文件名生成访问链接,这两个操作不是耦合的。
压缩图片选用谷歌给的包,评论都说这个方法效率高。
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
操作api非常简单,根据路径压缩图片后,在新路径生成文件。
Thumbnails.of(originalStringPath).scale(1f).outputQuality(compressFloat).toFile(returnPath);
下面是我能用到的代码
package com.aliyun.oss.demo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Base64;
import java.util.Calendar;
import java.util.Date;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.BucketInfo;
import net.coobird.thumbnailator.Thumbnails;
public class OSSServiceImpl {
private static String endpoint = "http://oss-cn-beijing.aliyuncs.com";
private static String accessKeyId = "";
private static String accessKeySecret = "";
private static String bucketName = "";
/**
* 获取bucket信息
* @return BucketInfo
*/
public BucketInfo getBucketInfo() {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
BucketInfo info = null;
try {
if (ossClient.doesBucketExist(bucketName)) {
System.out.println("您已经创建Bucket:" + bucketName + "。");
} else {
System.out.println("您的Bucket不存在,创建Bucket:" + bucketName + "。");
ossClient.createBucket(bucketName);
}
info = ossClient.getBucketInfo(bucketName);
System.out.println("Bucket " + bucketName + "的信息如下:");
System.out.println("\t数据中心:" + info.getBucket().getLocation());
System.out.println("\t创建时间:" + info.getBucket().getCreationDate());
System.out.println("\t用户标志:" + info.getBucket().getOwner());
} catch (OSSException oe) {
oe.printStackTrace();
} catch (ClientException ce) {
ce.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
ossClient.shutdown();
}
return info;
}
/**
* 根据路径上传Object
* @param fileKey
* @param filePath
* @return
* @throws URISyntaxException
*/
public String putObject(String fileKey, String filePath) throws URISyntaxException {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
URL url = null;
try {
ossClient.putObject(bucketName, fileKey, new File(filePath));
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);// 设置起时间
cal.add(Calendar.YEAR, 10);// 增加十年
url = ossClient.generatePresignedUrl(bucketName, fileKey, cal.getTime());
System.out.println("Object:" + fileKey + "存入OSS成功。" + "url为+++++++::" + url.toURI().toString());
} catch (OSSException oe) {
oe.printStackTrace();
} catch (ClientException ce) {
ce.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
ossClient.shutdown();
}
return url.toURI().toString();
}
/**
* 根据base64加密后的图片生成的字符串进行上传
* @param fileKey
* @param base64ImageString
* @param compressFloat
* @return 上传后的路径
* @throws URISyntaxException
*/
public String putObject(String fileKey, String base64ImageString, Float compressFloat) throws URISyntaxException {
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
URL url = null;
try {
// 将base64编码的文件转为输入流并上传到阿里云服务器
byte[] asBytes = Base64.getDecoder().decode(base64ImageString);
for (int i = 0; i < asBytes.length; ++i) {
if (asBytes[i] < 0) {// 调整异常数据
asBytes[i] += 256;
}
}
System.out.println("asBytes:" + asBytes.toString());
InputStream input = new ByteArrayInputStream(asBytes);
System.out.println("input:" + input);
OutputStream outputStream = OSSServiceImpl.compressPictures(input, compressFloat);
InputStream inputStream = OSSServiceImpl.parse(outputStream);
ossClient.putObject(bucketName, fileKey, inputStream);
inputStream.close();
outputStream.close();
// 设置访问路径过期时间
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);// 设置起时间
cal.add(Calendar.YEAR, 10);// 设置url过期时间为十年
// 获取路径
url = ossClient.generatePresignedUrl(bucketName, fileKey, cal.getTime());
System.out.println("Object:" + fileKey + "存入OSS成功。" + "url为+++++++::" + url.toURI().toString());
} catch (OSSException oe) {
oe.printStackTrace();
} catch (ClientException ce) {
ce.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
ossClient.shutdown();
}
return url.toURI().toString();
}
/**
* 根据输入流压缩图片,返回输出流
* @param inputStream
* @param compressFloat
* @return OutputStream
* @throws IOException
*/
public static OutputStream compressPictures(InputStream inputStream, Float compressFloat) throws IOException {
ByteArrayOutputStream returnInputStream = new ByteArrayOutputStream();
Thumbnails.of(inputStream).scale(1f).outputQuality(compressFloat).toOutputStream(returnInputStream);
return returnInputStream;
}
/**
* 根据路径压缩图片
* @param originalStringPath
* @param compressFloat
* @return
* @throws IOException
*/
public static String compressPictures(String originalStringPath, Float compressFloat, String returnPath)
throws IOException {
String returnPathString = returnPath;
Thumbnails.of(originalStringPath).scale(1f).outputQuality(compressFloat).toFile(returnPath);
return returnPathString;
}
/**
* 将输出流转为输出流
* @param out
* @return
* @throws Exception
*/
public static ByteArrayInputStream parse(OutputStream out) throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos = (ByteArrayOutputStream) out;
ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
baos.close();
return swapStream;
}
}