# 问题描述:
# 公司里面的很多实现都是先下载到本地,再将其转化为base64,感觉很别扭,毕竟有本地目录牵扯进来,硬盘容量、目录权限都有出错的可能,特别是在项目迁移或重新部署时;
# 这里的实现是根据ossKey去阿里云获取完整的临时访问路径,再通过读取访问路径、获取流、转化为base64;
1) pom依赖;
<!--oss依赖-->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.8.0</version>
</dependency>
<!--oss依赖-->
2) 获取OSSClient的实例,并取文件的临时受权访问路径;
import com.aliyun.oss.ClientConfiguration;
import com.aliyun.oss.OSSClient;
import com.aliyun.oss.common.auth.CredentialsProvider;
import com.aliyun.oss.common.auth.DefaultCredentialProvider;
import com.aliyun.oss.common.comm.Protocol;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLDecoder;
import java.util.Date;
/**
* @Author ds
*/
public class OssHelper {
// 阿里云 AccessKey ID
private static final String ACCESSKEYID = "Your AccessKey ID";
// 阿里云 AccessKey Secret
private static final String ACCESSKEYSECRET = "Your AccessKey Secret";
// OSS存储空间名称
private static final String ENDPOINT = "Your endPoint";
// OSS访问域名(外网)
private static final String BUCKETNAME = "Your bucketName";
/**
* 获取OSSClient实例
* @return
*/
public static OSSClient createOSSClient() {
CredentialsProvider credsProvider = new DefaultCredentialProvider(ACCESSKEYID, ACCESSKEYSECRET);
ClientConfiguration config = new ClientConfiguration();
config.setProtocol(Protocol.HTTPS);
OSSClient client = new OSSClient(ENDPOINT, credsProvider, config);
return client;
}
/**
* 取文件的临时受权访问路径
*
* @param objectName
* @return
*/
public static String ossUrl(String objectName) throws UnsupportedEncodingException {
// 创建OSSClient实例
OSSClient ossClient = OssHelper.createOSSClient();
// 设置URL过期时间为2小时
Date expiration = new Date(System.currentTimeMillis() + 3600 * 1000 * 2);
// 生成以GET方法访问的签名URL,访客可以直接通过浏览器访问相关内容。
URL url = ossClient.generatePresignedUrl(BUCKETNAME, objectName, expiration);
String decode = URLDecoder.decode(String.valueOf(url), "UTF-8");
decode = decode.replaceAll("\\+", "%2b");
// 关闭OSSClient
ossClient.shutdown();
return decode;
}
}
3) 根据url获取base64;
import sun.misc.BASE64Encoder;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* @Author ds
*/
public class Base64Utils {
public static String getBase64ByUrl(String fileUrl) {
String base64String = "";
try {
//new一个URL对象
URL url = new URL(fileUrl);
//打开链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
//得到图片的二进制数据,以二进制封装得到数据,具有通用性
byte[] data = readInputStream(inStream);
BASE64Encoder encode = new BASE64Encoder();
base64String = encode.encode(data);
} catch (Exception e) {
e.printStackTrace();
}
return base64String;
}
private static byte[] readInputStream(InputStream inStream) throws Exception {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while ((len = inStream.read(buffer)) != -1) {
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
//关闭输入流
inStream.close();
//把outStream里的数据写入内存
return outStream.toByteArray();
}
}
4) 测试;
/**
* @Author ds
*/
public class OssTest {
public static void main(String[] args){
try {
String base64Str = Base64Utils.getBase64ByUrl(OssHelper.ossUrl("60f606b79ce64ce184c4bf034bb87277.pdf"));
System.out.println("******* start *****");
System.out.println("base64 : " + base64Str.substring(0,100));
System.out.println("******* end *****");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
# 输出:
******* start *****
base64 : JVBERi0xLjcKJeLjz9MKMSAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9Gb3JtL1Jlc291
cmNlczw8L0ZvbnQ8PC9TVFN
******* end *****
网友评论