阿里云OSS上传文件
阿里云官网内搜:对象存储OSS
一、开通(套餐或者流量计费)文件少就流量计费,不太贵,点击立即开通
二、创建Bucket(创建桶,类似目录的概念,创建后无法更改除非删除)
以上就配置完毕,此时就可以在此页面手动上传删除文件了
(另外账号密码都可以在这里更改)
二、开发思路
为什么不直接用js从前端上传文件到阿里云呢?因为账号密码可能暴露。
(如果考虑文件太大占用后端服务性能,其实可以前端只从服务器拿一个账号密码授权,然后再直接从前端上传到阿里云)
三、后端开发
1.阿里云官网内搜:对象存储OSS
2.引入SDK依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
4.提前开通子账号
1.前提是公司已经开通了OSS账号(因为代码里要用账号密码。但是开通后生成的是主账号,为防止删桶跑路,可以再开出子账号,设定相关权限供程序员使用)
同理,再给一个AliyunSTSAssumeRoleAccess权限。
五、就可以根据示例代码创建Bucket桶(存储空间)、上传文件、下载文件
1.创建桶
代码.创建桶的示例代码里注释掉的代码和手动在页面创建桶是对应的,可以根据需要释放相关代码。
对于创建Bucket桶(存储空间)的步骤,选中代码这里是通过环境变量配置的,也可以把代码改成下一张图片的使用accessKeyId和accessKeySecret的方式
创建成功后就能在页面的桶列表里找到新创建的桶了
2.上传文件(文件名最好唯一名称,如加时间戳截取)
如果需要返回上传成功的文件路径供用户查看,则这样拼接一下字符串即可
3.删除文件
删除时文件名不应该写死的,应该是从保存的路径里截取的:
六、Java代码和Vue代码
public class AnnexUtils {
public static String upload(MultipartFile file){
// Endpoint以(上海)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-shanghai.aliyuncs.com";
// 使用代码嵌入的RAM用户的访问密钥配置访问凭证
String accessKeyId = "xxxxxxx";
String accessKeySecret = "xxxxxxx";
CredentialsProvider credentialsProvider = new DefaultCredentialProvider(accessKeyId, accessKeySecret);
// 填写Bucket名称.
String bucketName = "anmuzidonghua";
//保存的目录
String module ="word/anmu";
//文件名
String filePath = file.getOriginalFilename();
//填写Object完整路径,拼接目录+时间戳+UUID+后缀扩展名
String objectName = module+"/"+System.currentTimeMillis()+"_"
+ UUID.randomUUID().toString().substring(0,6)+
filePath.substring(filePath.lastIndexOf("."));
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
// InputStream inputStream = new FileInputStream(filePath);
InputStream inputStream = file.getInputStream();
// 创建PutObjectRequest对象。
//参数1:桶名,参数2:保存到oss的路径+文件名,参数3:要上传的文件
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);
//设置该属性可以返回response,不设置返回的response为空
putObjectRequest.setProcess("true");
// 创建PutObject请求。
PutObjectResult result = ossClient.putObject(putObjectRequest);
// 可以查看状态码,200是成功;
System.out.println(result.getResponse().getStatusCode());
//拼接上传后的文件路径
//https://sh220828-srb.oss-cn-shanghai.aliyuncs.com/imgs/2023/01/12/1673507930341_4209ba.jpg
String path = "https://"+ bucketName+".oss-cn-shanghai.aliyuncs.com/"+objectName;
return path;
} catch (Exception ce) {
System.out.println("Error Message:" + ce.getMessage());
return "上传失败啦";
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
<el-upload
ref="upload"
:action="uploadUrl"
:headers="headers"
:multiple="false"
:file-list="fileList"
:on-success="handleSuccess"
:on-error="handleError"
class="upload-demo"
style="margin-left: 20px;"
>
<el-button size="small" type="primary">上传附件</el-button>
<div slot="tip" class="el-upload__tip">只能上传不超过500kb的文件</div>
</el-upload>
export default {
data() {
return {
uploadUrl: '/dev-api/system/demand/upload',
headers: {},
fileList: []
}
}
}
methods: {
handleSuccess(response, file, fileList) {
// 处理上传附件成功的操作
console.log('上传成功', response, file, fileList);
},
handleError(error, file, fileList) {
// 处理上传失败的操作
console.log('上传失败', error, file, fileList);
},
}