图片上传至百度智能云BOS

由于使用阿里云OSS时,如果Bucket不绑定自己的域名,则无法通过URL直接预览图片,而是通过附件的形式下载。而且我自己购买的域名并不满足备案条件,于是改用百度智能云提供的BOS对象存储。

阿里云官方说明:

访问您的图片文件,无法预览,直接下载,是由于从从2019年9月23日起,针对之后新建的Bucket,直接使用OSS提供的默认域名,从互联网访问OSS上该Bucket的图片类型文件时,mimetype为以下值,

Response Header中会自动加上Content-Disposition:’attachment=filename;’。

即从浏览器访问图片类型文件时,会以附件形式进行下载,如果您要直接在浏览器中预览文件而非下载文件,请设置文件HTTP头中的Content-Disposition为inline并使用Bucket绑定的自定义域名进行访问


以下是我的图片上传至百度智能云BOS具体步骤:

1.开通百度智能云对象存储BOS

首页搜索对象存储,开通后跳转到管理控制台

2.创建Bucket

点击Bucket列表

3.导入依赖

1
2
3
4
5
<dependency>
<groupId>com.baidubce</groupId>
<artifactId>bce-java-sdk</artifactId>
<version>0.10.261</version>
</dependency>

4.编写工具类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import com.baidubce.auth.DefaultBceCredentials;
import com.baidubce.services.bos.BosClient;
import com.baidubce.services.bos.BosClientConfiguration;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.UUID;


public class BosUpload {
// 访问域名
public static final String BAIDUYUN_DOMAIN = "xxx";
// 用户的Access Key ID
public static final String ACCESS_KEY_ID = "xxx";
// 用户的Secret Access Key
public static final String SECRET_ACCESS_KEY = "xxx";
// Bucket的名字
public static final String BUCKET_NAME = "xxx";

public static String uploadImg(MultipartFile file) throws IOException {
// 初始化一个BosClient
BosClientConfiguration config = new BosClientConfiguration();
config.setCredentials(new DefaultBceCredentials(ACCESS_KEY_ID, SECRET_ACCESS_KEY));
BosClient client = new BosClient(config);

//生成文件名
String originalFilename = file.getOriginalFilename();
String extension = "."+ FilenameUtils.getExtension(originalFilename);
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
String fileName = uuid+extension;

//执行上传
client.putObject(BUCKET_NAME,fileName, file.getBytes());

//返回url
return BAIDUYUN_DOMAIN + fileName;
}
}

其中ACCESS_KEY_IDSECRET_ACCESS_KEY可以在图片中的页面中得到

默认域名可以在随便上传一张图片后打开看到

比如这里是 https://bucket-demo01.bj.bcebos.com/

5.测试

Controller接口

1
2
3
4
5
6
7
@RestController
public class TestController {
@PostMapping("/upload")
public String upload(MultipartFile file){
return BosUpload.uploadImg(file);
}
}

前端页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>

<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" value="上传图片">
<input type="submit" value="上传">
</form>

</body>
</html>

选择图片上传后

看到页面返回了图片的URL,再到百度智能云的控制台可以看到已经上传成功了

最后要注意,通过URL访问需要开启公共读权限


更多操作内容可以参考官方文档

概述 - 对象存储BOS | 百度智能云文档 (baidu.com)