阿里云配置
STS配置
STS上传主要参数
{
host: r.host,
OSSAccessKeyId: r.accessKeyId,
policy: policy,
signature: computeSignature(r.accessKeySecret, policy),
"x-oss-security-token": r.securityToken,
dir: r.dir
}
功能描述
- 点击:选择上传文件 选择文件
- 获取 STS凭证
- 上传阿里云
- 成功后下方会出现上传列表
- 支持点击删除进行列表操作
效果展示

1. 获取STS凭证及上传
function computeSignature(accessKeySecret, canonicalString) {
return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret))
}
export function ossUpload(_files) {
if (!_files) return Promise.resolve({ status: "fail" })
const files = Array.isArray(_files) ? [..._files] : [{ ..._files }]
return getPlmAppStsToken()
.then((r) => {
const policy = Base64.encode(
JSON.stringify({
expiration: r.expiration,
conditions: [
["content-length-range", 0, 1024 * 1024 * 1024],
],
})
)
return {
host: r.host,
OSSAccessKeyId: r.accessKeyId,
policy: policy,
signature: computeSignature(r.accessKeySecret, policy),
"x-oss-security-token": r.securityToken,
dir: r.dir,
}
})
.then((params) => {
return Promise.all([
...files.map((i, index) => {
const fileExtension = i.name.split(".").pop();
const fileKey = `${moment().valueOf()}${index}${fileExtension}`
return new Promise((resolve, reject) => {
uni.uploadFile({
url: params.host,
filePath: i.path,
name: "file",
formData: {
...params,
key: fileKey,
},
success: (result) => {
const { statusCode } = result
if (statusCode === 204) {
resolve({
...i,
key: fileKey,
imgUrl: params.host + "/" + fileKey
})
} else {
reject({ status: "fail", err: result })
}
},
fail: (e) => reject({ status: "fail", err: e }),
})
})
}),
])
})
.then((r) => ({ status: "success", files: r }))
}
2. 打开文件列表
2.1. 飞书小程序
const fileUpload = () => {
tt.filePicker({
maxNum: 10,
pickerTitle: "选择一个文件",
pickerConfirm: "确认选择",
isSystem: true,
success: async (res) => {
},
fail(res) {
console.log(`读取失败: ${JSON.stringify(res)}`)
},
})
}
2.2. 微信小程序
<uni-file-picker
v-model="form.imageValue"
fileMediatype="image"
mode="grid"
:autoUpload="false"
@select="select"
@delete="deleteImg"
/>
- 使用
chooseMedia
和 chooseImage
uni.chooseMedia({
count: 1,
mediaType: ['image'],
success: ({ tempFilePaths, tempFiles }) => {
ossUpload(res.tempFilePaths)
},
})
uni.chooseImage({
count: 1,
success: ({ tempFilePaths, tempFiles }) => {
ossUpload(tempFilePaths)
},
fail: (error) => {},
})
2.3. 数据处理
const fileList = reactive([])
...
success: async (res) => {
const result = await ttOssUpload(res?.list)
const files = JSON.parse(JSON.stringify(result)).files
files.forEach((file) => {
fileList.push(file)
})
},
...
const handleButtonClick = (index) => {
fileList.splice(index, 1)
}
2.4. 按钮触发及列表渲染操作
<view @tap="fileUpload">选择上传文件</view>
<view class="file-list">
<view class="file-item"
v-for="(item, index) in fileList"
:key="item.imgUrl"
>
<label class="name"> {{ item.name }}</label>
<label class="delete"
@tap="handleButtonClick(index)"
>删除</label>
</view>
</view>
</view>
...
. file -item {
display: flex;
justify-content: space-between;
padding: 4rpx;
margin: 4rpx;
background: #f5f3f3;
. name {
color: #27ba9b;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: calc(100% - 80rpx);
}
. delete {
color: #f00;
}
}