实际工作中,需要用阿里云对象存储保存图片,并且在上传图片到阿里云对象存储服务器后,获取图片在阿里云对象存储服务器的URL地址,以便给 WEB 前端显示。
阿里云对象存储上传图片的工具类
java
package zhangchao;
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.UUID;
/**
* 阿里云对象存储工具类
*/
public class OSSUtils {
// OSS阿里云对象存储的AK和SK
private static final String OSS_AK = "yourAK";
private static final String OSS_SK = "yourSK";
// OSS阿里云对象存储的Bucket名称
private static final String OSS_BUCKET_NAME = "your-files";
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
private static final String OSS_ENDPOINT = "https://oss-cn-hangzhou.aliyuncs.com";
/**
* 上传图片并返回图片URL
* @return 图片URL
*/
public static String uploadImage(String imageFilePath) {
String result = null;
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(OSS_ENDPOINT, OSS_AK, OSS_SK);
FileInputStream fis = null;
try {
// 创建存储空间。
fis = new FileInputStream(imageFilePath);
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
ossClient.putObject(OSS_BUCKET_NAME, uuid, fis);
// 设置URL过期时间为10年 3600l * 1000 * 24 * 365 * 10
Date expiration = new Date(System.currentTimeMillis() + 3600L * 1000L *
24L * 365L * 10L);
URL url = ossClient.generatePresignedUrl(OSS_BUCKET_NAME, uuid, expiration);
if (url != null) {
result = url.toString();
}
} catch (OSSException oe) {
StringBuilder sb = new StringBuilder();
sb.append("Caught an OSSException, which means your request made it to OSS, ")
.append("but was rejected with an error response for some reason.");
sb.append("Error Message:").append(oe.getErrorMessage());
sb.append("Error Code:").append(oe.getErrorCode());
sb.append("Request ID:").append(oe.getRequestId());
sb.append("Host ID:").append(oe.getHostId());
System.out.println(sb.toString());
} catch (ClientException ce) {
StringBuilder sb = new StringBuilder();
sb.append("Caught an ClientException, which means the client encountered ")
.append("a serious internal problem while trying to communicate with OSS, ")
.append("such as not being able to access the network.");
sb.append("Error Message:" + ce.getMessage());
System.out.println(sb.toString());
ce.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
try {
if (null != fis) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
if (ossClient != null) {
ossClient.shutdown();
}
}
return result;
}
}
调用的 main 方法:
java
package zhangchao;
public class Main {
public static void main(String[] args) {
String imgUrl = OSSUtils.uploadImage("E:\\ws\\zc\\Java8OSSImg\\src\\main\\resources\\q1.jpg");
System.out.println(imgUrl);
}
}
运行结果,这里显示了返回的图片 URL 地址:
bash
https://your-files.oss-cn-hangzhou.aliyuncs.com/abc123?Expires=2021599742&OSSAccessKeyId=youAK&Signature=xxxxxx
这个地址没办法用浏览器直接看,需要写个HTML来测试一下。
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<img src="https://your-files.oss-cn-hangzhou.aliyuncs.com/abc123?Expires=2021599742&OSSAccessKeyId=youAK&Signature=xxxxxx">
</body>
</html>