uni-app 上传失败 [阿里云:ly-renyang-cloud]云对象uni-pay-co上传失败。
uni-app 上传失败 [阿里云:ly-renyang-cloud]云对象uni-pay-co上传失败。
操作步骤:
- 对uniCloud目录点右键,启动 uniCloud服务空间初始化向导,发布最新云函数
预期结果:
- 上传成功
实际结果:
- 上传失败
bug描述:
- [阿里云:ly-renyang-cloud]云对象uni-pay-co上传失败。失败原因:InvalidRuntime: Specified parameter Runtime is not valid. RequestId: 04FA0B93-3A7B-5DF9-A079-6D1EC5D53ED1 POST “http://mpserverless.aliyuncs.com” 400。
2 回复
修改文件 /uni_modules/uni-pay/uniCloud/cloudfunctions/uni-pay-co/package.json 中的 Nodejs8 改成 Nodejs16 然后重新再上传
针对你提到的 uni-app
上传到阿里云对象存储(OSS)时遇到的问题,这里提供一个完整的代码示例,用于在 uni-app
中上传文件到阿里云 OSS。假设你已经配置好了阿里云 OSS 的相关参数(如 AccessKeyId、AccessKeySecret、BucketName、Region 等),并且已经在阿里云控制台创建了相应的策略(Policy)和凭证(STS)。
以下是一个简单的代码示例,演示如何在 uni-app
中实现文件上传:
// 在 pages/index/index.vue 中
<template>
<view>
<button @click="chooseImage">选择图片</button>
<image v-if="imageUrl" :src="imageUrl" style="width: 100px; height: 100px;"></image>
</view>
</template>
<script>
export default {
data() {
return {
imageUrl: '',
ossData: {
accessKeyId: 'your-access-key-id',
accessKeySecret: 'your-access-key-secret',
stsToken: '',
region: 'your-oss-region',
bucket: 'ly-renyang-cloud',
policy: '', // 这里通常是通过后端获取的Policy字符串
signature: '', // Policy的签名,也是后端生成的
ossHost: 'https://' + this.bucket + '.' + this.region + '.aliyuncs.com',
},
};
},
methods: {
chooseImage() {
uni.chooseImage({
count: 1,
success: (res) => {
this.imageUrl = res.tempFilePaths[0];
this.uploadToOSS(res.tempFilePaths[0]);
},
});
},
async uploadToOSS(filePath) {
// 假设你已经通过后端接口获取了stsToken, policy, signature等必要信息
// 这里用mock数据代替,实际使用时需要通过请求后端接口获取
const response = await uni.request({
url: 'https://your-backend-api/get-oss-upload-info', // 替换为你的后端接口
method: 'POST',
});
this.ossData.stsToken = response.data.stsToken;
this.ossData.policy = response.data.policy;
this.ossData.signature = response.data.signature;
const formData = new FormData();
formData.append('key', 'uni-pay-co/' + Date.now() + '_' + filePath.split('/').pop());
formData.append('OSSAccessKeyId', this.ossData.accessKeyId);
formData.append('policy', this.ossData.policy);
formData.append('Signature', this.ossData.signature);
formData.append('success_action_status', '200');
formData.append('file', {
uri: filePath,
name: filePath.split('/').pop(),
type: 'application/octet-stream', // 根据实际情况修改MIME类型
});
uni.uploadFile({
url: this.ossData.ossHost,
filePath: filePath,
name: 'file',
formData: formData,
success: (uploadFileRes) => {
console.log('上传成功', uploadFileRes);
},
fail: (err) => {
console.error('上传失败', err);
},
});
},
},
};
</script>
注意:
- 在实际应用中,不要直接在客户端存储
accessKeyId
和accessKeySecret
,应该使用阿里云的STS服务获取临时凭证。 policy
和signature
通常是通过后端接口获取的,后端需要根据用户请求动态生成这些参数。- 示例中的
uni.chooseImage
和uni.uploadFile
是uni-app
提供的API,用于选择文件和上传文件。 - 示例中的
FormData
对象用于构造上传请求的数据。