阿里云对象存储 >> 上传文件(超详细)
1、登录阿里云
2、开通OSS对象存储服务
3、创建bucket
(就不详细介绍了)
代码
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.10.2</version>
</dependency>
如果使用的是Java 9及以上的版本,则需要添加jaxb相关依赖。添加jaxb相关依赖示例代码如下:
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
做项目经常要用到,于是将 OSS 上传文件,下载访问文件 url,封装成一个 utils
public class AliOSS {
// 帐号信息
public final static String endpoint = "http://oss-cn-hangzhou.aliyuncs.com";
public final static String accessKeyId = "";
public final static String accessKeySecret = "";
public final static String bucketName = "";
// 生成可下载url
public static String getFileUrl(MultipartFile fileUpload) throws OSSException, ClientException, IOException {
// 获取文件后缀名
String suffix = getSuffix(fileUpload);
// 创建OSSClient实例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 文件名格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
// 确保名称唯一,使用 uuid 比较好,不要使用时间字符串,应对不了高并发
// String code = UUID.randomUUID().toString();
// 该桶中的文件key
String dateString = sdf.format(new Date()) + "." + suffix; // 20210316115220.jpg
// 设置URL过期时间为100年,默认这里是int型,转换为long型即可
Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100);
try {
// 上传文件
//下面这行代码,访问url将不会预览而是直接下载下来
ossClient.putObject(bucketName, dateString, new ByteArrayInputStream(fileUpload.getBytes()));
} catch (OSSException oe) {
System.out.println("捕获到一个OSSException,这意味着您的请求已发送到OSS,但是由于某种原因被拒绝了。");
System.out.println("Error Message: " + oe.getErrorMessage());
System.out.println("Error Code: " + oe.getErrorCode());
System.out.println("Request ID: " + oe.getRequestId());
System.out.println("Host ID: " + oe.getHostId());
} catch (ClientException ce) {
System.out.println("捕获到ClientException,这意味着客户端在尝试与OSS通信时遇到严重的内部问题,例如无法访问网络。");
System.out.println("Error Message: " + ce.getMessage());
} finally {
ossClient.shutdown();
}
// 生成URL
URL url = ossClient.generatePresignedUrl(bucketName, dateString, expiration);
return url.toString();
}
// 生成预览url
public static String getImgUrl(MultipartFile fileUpload) throws OSSException, ClientException, IOException {
// 获取文件后缀名
String suffix = getSuffix(fileUpload);
// 创建OSSClient实例
OSSClient ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret);
// 文件名格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
// 确保名称唯一,使用 uuid 比较好,不要使用时间字符串,应对不了高并发
// String code = UUID.randomUUID().toString();
// 该桶中的文件key
String dateString = sdf.format(new Date()) + "." + suffix; // 20210316115220.jpg
//如果没有下面这两行代码,访问url将不会预览而是直接下载下来
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/jpg");
// 设置URL过期时间为100年,默认这里是int型,转换为long型即可
Date expiration = new Date(new Date().getTime() + 3600L * 1000 * 24 * 365 * 100);
try {
// 上传文件
//下面这行代码,访问url将不会预览而是直接下载下来
ossClient.putObject(bucketName, dateString, new ByteArrayInputStream(fileUpload.getBytes()));
//下面这行代码,访问url将会预览
//ossClient.putObject(bucketName, dateString, new ByteArrayInputStream(fileUpload.getBytes()), metadata);
} catch (OSSException oe) {
System.out.println("捕获到一个OSSException,这意味着您的请求已发送到OSS,但是由于某种原因被拒绝了。");
System.out.println("Error Message: " + oe.getErrorMessage());
System.out.println("Error Code: " + oe.getErrorCode());
System.out.println("Request ID: " + oe.getRequestId());
System.out.println("Host ID: " + oe.getHostId());
} catch (ClientException ce) {
System.out.println("捕获到ClientException,这意味着客户端在尝试与OSS通信时遇到严重的内部问题,例如无法访问网络。");
System.out.println("Error Message: " + ce.getMessage());
} finally {
ossClient.shutdown();
}
// 生成URL
URL url = ossClient.generatePresignedUrl(bucketName, dateString, expiration);
return url.toString();
}
// 获取文 MultipartFile 文件后缀名工具
public static String getSuffix(MultipartFile fileUpload){
String originalFilename = fileUpload.getOriginalFilename();
String suffix = null;
if (originalFilename != null) {
suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
}
System.out.println(suffix);
return suffix;
}
}