阿里云OSS前端直传(Browser.js)
百变小洋 2024-10-06 11:33:01 阅读 66
Browser.js安装
安装依赖包或引入js文件:
npm install ali-oss
npm install uuid
<code> <el-upload
class="upload-demo"code>
drag
:file-list="fileList1"code>
action=""code>
:http-request="handleUpload"code>
multiple>
<i class="el-icon-upload"></i>code>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>code>
<div class="el-upload__tip" slot="tip">只能上传jpg/png文件,且不超过500kb</div>code>
</el-upload>
handleUpload(op) {
oss.bucketUpload(op.file,
(res) => {
console.log(res);
});
},
handlePreview(path) {
oss.bucketPreview(path,
(res) => {
console.log(res)
})
}
import {getUploadVoucher} from "@/api/oss";
// uuidv4
import {v4 as uuidv4} from 'uuid';
import path from "path";
const OSS = require('ali-oss')
export default {
/**
* 阿里云oss sdk文件上传 dir 上传到的文件位置
* @param {*} file 文件流
* @param {*} successCallback 成功回调
* @param {*} errCallBack 失败回调
* @param {*} dir 上传文件夹路径 譬如images
*/
bucketUpload(file, successCallback = new Function(), dir = 'zlProcess') {
let fileName = file.name// 先获取上传要的资料签名
// 后台接口
getUploadVoucher().then((res) => {
if (res.code === 200) {
let obj = res.data.credentials || {}
// 实例化一个上传客户端
const client = new OSS({
// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
region: 'oss-cn-hangzhou',
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
accessKeyId: obj.accessKeyId,
accessKeySecret: obj.accessKeySecret,
// 从STS服务获取的安全令牌(SecurityToken)。
stsToken: obj.securityToken,
// 填写Bucket名称。
bucket: 'zl-process',
})
try {
// 填写Object完整路径。Object完整路径中不能包含Bucket名称。
// 您可以通过自定义文件名(例如exampleobject.txt)或文件完整路径(例如exampledir/exampleobject.txt)的形式实现将数据上传到当前Bucket或Bucket中的指定目录。
// data对象可以自定义为file对象、Blob数据或者OSS Buffer。
let uuid = uuidv4() + "/" + fileName;
if (dir.substring(dir.length - 1, 1) !== '/') {
dir += '/'
}
const result = client.put(dir + uuid, file);
result.then(res => {
// let size = file.size > 1000000 ? parseFloat(file.size / 1000000).toFixed(2) + 'M' : parseFloat(file.size / 1000).toFixed(2) + 'KB'
successCallback({
name: res.name,
url: res.url
})
})
} catch (e) {
console.log(e)
}
} else {
this.$message.warning("获取STSToken失败");
}
}
);
},
bucketPreview(path, successCallback = new Function()) {
getUploadVoucher().then((res) => {
if (res.code === 200) {
let obj = res.data.credentials || {}
// 实例化一个上传客户端
const client = new OSS({
// yourRegion填写Bucket所在地域。以华东1(杭州)为例,yourRegion填写为oss-cn-hangzhou。
region: 'oss-cn-hangzhou',
// 从STS服务获取的临时访问密钥(AccessKey ID和AccessKey Secret)。
accessKeyId: obj.accessKeyId,
accessKeySecret: obj.accessKeySecret,
// 从STS服务获取的安全令牌(SecurityToken)。
stsToken: obj.securityToken,
// 填写Bucket名称。
bucket: 'zl-process',
});
const url = client.signatureUrl(path, {
// 如果您希望生成的签名URL可以应用图片样式的效果,您可以通过process参数指定样式,格式为style/样式名称。
// process: "style/imagestyle",
});
// 设置URL的有效时长。单位为秒。如果不设置有效时长,则默认为1800。
// url = client.signatureUrl('example.jpg', {expires: 3600});
// console.log(url);
successCallback({
url: url
})
}
})
}
}
客户端向业务服务器请求上传策略。
客户端首先向业务服务器发送请求,请求中应包含所需上传操作的最小权限需求(例如上传到特定Bucket的权限)和期望的有效时间等信息。不同于直接请求Post签名和Post Policy,客户端需要请求的是一个带有特定权限限制的STS Token以及上传策略。
业务服务器向STS服务请求获取STS Token。
业务服务器收到客户端请求后,使用长期凭证向阿里云STS服务发起请求,生成一个具有限定权限和有效时间的STS Token。
STS服务向业务服务器返回STS Token。
业务服务器根据STS Token和其他上传限制生成上传策略。
业务服务器根据返回的STS Token和其他上传限制条件(例如Bucket名称、目录路径、过期时间等)生成一个安全的上传策略(Policy),并返回给客户端。
客户端构造并提交表单上传请求。
客户端使用收到的STS Token和上传策略,结合文件信息构造HTML表单。此时,上传策略中的签名和STS Token的加入使得客户端可以直接与OSS交互,而无需暴露业务服务器的长期凭证。
OSS返回成功响应给客户端。
引入pom依赖包:
<!--阿里云oss 2.5.0-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>cloudauth20221125</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
<version>1.1.0</version>
</dependency>
<code>package com.process.web.controller.common;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.tea.TeaException;
import com.process.common.core.controller.BaseController;
import com.process.common.core.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @author
* @title
* @description
* @updateTime 2024/7/19 9:41
* @throws
*/
@RestController
@RequestMapping("/api/aliyun")
public class ApiAliyunController extends BaseController {
@Value("${oss.aliyunAccessKeyId}")
private String aliyunAccessKeyId;
@Value("${oss.aliyunAccessKeySecret}")
private String aliyunAccessKeySecret;
/**
* <b>description</b> :
* <p>使用AK&SK初始化账号Client</p>
*
* @return Client
* @throws Exception
*/
public com.aliyun.sts20150401.Client createClient() throws Exception {
// 工程代码泄露可能会导致 AccessKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考。
// 建议使用更安全的 STS 方式,更多鉴权访问方式请参见:https://help.aliyun.com/document_detail/378657.html。
com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_ID。
.setAccessKeyId(aliyunAccessKeyId)
// 必填,请确保代码运行环境设置了环境变量 ALIBABA_CLOUD_ACCESS_KEY_SECRET。
.setAccessKeySecret(aliyunAccessKeySecret);
// Endpoint 请参考 https://api.aliyun.com/product/Sts
config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
return new com.aliyun.sts20150401.Client(config);
}
/**
* 获取oss STS Token
*
* @return
*/
@GetMapping("/getStsToken")
@ResponseBody
public AjaxResult getStsToken() {
com.aliyun.sts20150401.Client client = null;
try {
client = createClient();
} catch (Exception e) {
throw new RuntimeException(e);
}
com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
.setRoleArn("acs:ram::1********:role/r*******")
.setRoleSessionName("a****");
com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
AssumeRoleResponse assumeRoleResponse = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
Integer statusCode = assumeRoleResponse.statusCode;
if (200 == statusCode) {
// System.out.println(assumeRoleResponse);
return AjaxResult.success(assumeRoleResponse.body);
}
} catch (TeaException error) {
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
// 错误 message
System.out.println(error.getMessage());
// 诊断地址
System.out.println(error.getData().get("Recommend"));
com.aliyun.teautil.Common.assertAsString(error.message);
}
return AjaxResult.error();
}
}
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。