7***@qq.com
7***@qq.com
  • 发布:2020-07-13 10:33
  • 更新:2022-10-13 22:28
  • 阅读:2475

UNIAPP使用ali-oss报Cannot read property 'x-oss-request-id' of undefined错误

分类:uni-app

在uniapp中引入了ali-oss,使用list方法获取图片列表报错
TypeError: Cannot read property 'x-oss-request-id' of undefined
at Client.requestError$ (vendor.js:9085)
at tryCatch (vendor.js:25108)
at Generator.invoke [as _invoke] (vendor.js:25342)
at Generator.prototype.<computed> [as next] (vendor.js:25160)
at tryCatch (vendor.js:25108)
at invoke (vendor.js:25198)
at vendor.js:25241
at new Promise (<anonymous>)
at callInvokeWithMethodAndArg (vendor.js:25240)
at AsyncIterator.enqueue [as _invoke] (vendor.js:25263)

运行在web端就没有问题,可以获取图片列表,运行到小程序和打包就报错,有人有遇到过这个问题吗

2020-07-13 10:33 负责人:无 分享
已邀请:
刘邦修车网

刘邦修车网 - 工具APP

这个论坛很少有人实际解决问题,差评

1***@qq.com

1***@qq.com

app端也遇到了

wbkou

wbkou

你好,这个问题最终怎么解决的

9***@qq.com

9***@qq.com

客户端获取STS临时账号并生成签名

import crypto from 'crypto-js';  
import { Base64 } from 'js-base64';  

// 计算签名。  
function computeSignature(accessKeySecret, canonicalString) {  
  return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecret));  
}  

const date = new Date();  
date.setHours(date.getHours() + 1);  
const policyText = {  
  expiration: date.toISOString(), // 设置policy过期时间。  
  conditions: [  
    // 限制上传大小。  
    ["content-length-range", 0, 1024 * 1024 * 1024],  
  ],  
};  

async function getFormDataParams() {  
  const credentials = await axios.get('/getToken')   // 这是请求后端接口,获得stsToken临时令牌相关信息  
  const policy = Base64.encode(JSON.stringify(policyText)) // policy必须为base64的string。  
  const signature = computeSignature(credentials.AccessKeySecret, policy)  
  const formData = {  
    OSSAccessKeyId: credentials.AccessKeyId,  
    signature,  
    policy,  
    'x-oss-security-token': credentials.SecurityToken   
  }  
  return formData  
}

用微信小程序自带的wx.uploadFile()直传,不过我是改用uniapp自带uni.uploadFile(), 他们的用法无大区别,后者兼容性应该好一点

const host = '<host>';  
const signature = '<signatureString>';  
const ossAccessKeyId = '<accessKey>';  
const policy = '<policyBase64Str>';  
const key = '<object name>';  
const securityToken = '<x-oss-security-token>';   
const filePath = '<filePath>'; // 待上传文件的文件路径。  
wx.uploadFile({  
  url: host, // 开发者服务器的URL。  
  filePath: filePath,  
  name: 'file', // 必须填file。  
  formData: {  
    key,  
    policy,  
    OSSAccessKeyId: ossAccessKeyId,  
    signature,  
    // 'x-oss-security-token': securityToken // 使用STS签名时必传。  
  },  
  success: (res) => {  
    if (res.statusCode === 204) {  
      console.log('上传成功');  
    }  
  },  
  fail: err => {  
    console.log(err);  
  }  
});

参考资料:阿里云官方文档说的

要回复问题请先登录注册