uni-app 上传失败 [阿里云:ly-renyang-cloud]云对象uni-pay-co上传失败。

发布于 1周前 作者 yibo5220 来自 Uni-App

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>

注意

  1. 在实际应用中,不要直接在客户端存储 accessKeyIdaccessKeySecret,应该使用阿里云的STS服务获取临时凭证。
  2. policysignature 通常是通过后端接口获取的,后端需要根据用户请求动态生成这些参数。
  3. 示例中的 uni.chooseImageuni.uploadFileuni-app 提供的API,用于选择文件和上传文件。
  4. 示例中的 FormData 对象用于构造上传请求的数据。
回到顶部