uni-app uniCloud.uploadFile 云函数 调用 阿里云云存储 失败

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

uni-app uniCloud.uploadFile 云函数 调用 阿里云云存储 失败

示例代码:

'use strict';  
exports.main = async (event, context) => {  
    //event为客户端上传的参数  
    console.log('event : ', event)  

    let body = JSON.parse(event.body);  
    console.log('body : ', body)  
    console.log('body.filepath : ', body.filepath)  

    let result = await uniCloud.uploadFile({  
        cloudPath: '123.txt',  
        fileContent: body.buffer,  
    });  

    event.fileID=result.fileID  
    event.requestId=result.requestId  
    //返回数据给客户端  
    return event  
};  

操作步骤:

  • 文件存入云存储

预期结果:

  • 完成文件存入云存储

实际结果:

  • 各种提示和文档不符合

bug描述:

  • uniCloud.uploadFile
  • 提示信息与文档不相干 提示

情况1

[file-opration/ac1402031654596366920155975/77ms/ERROR] 参数校验错误: Invalid options.filePath
Error: 参数校验错误: Invalid options.filePath
at E (/code/index.js:34:17924)
at uploadFile (/code/index.js:227:475630)
at (/tmp/function/@dcloudio/serverless/lib/aliyun/uni-cloud.js:1:2894)
at exports.main (/tmp/function/__index.js:10:30)
at i (/tmp/function/index.js:1:2982)
at p (/tmp/function/index.js:1:3580)
at runUserFunction (/code/index.js:118:207833)
at (<anonymous>)
at _tickCallback (internal/process/next_tick.js:189:7)
请求响应状态: fail
cloudPath换成filePath  

其他情况 这个只是举例 如果fileContent不传

情况2

[file-opration/ac1425191654596791187149132/74ms/ERROR] 参数校验错误: filePathfileBuffer不能都为空
Error: 参数校验错误: filePathfileBuffer不能都为空
at E (/code/index.js:34:17924)
at uploadFile (/code/index.js:227:475835)
at (/tmp/function/@dcloudio/serverless/lib/aliyun/uni-cloud.js:1:2894)
at exports.main (/tmp/function/__index.js:10:30)
at i (/tmp/function/index.js:1:2982)
at p (/tmp/function/index.js:1:3580)
at runUserFunction (/code/index.js:118:207833)
at (<anonymous>)
at _tickCallback (internal/process/next_tick.js:189:7)
请求响应状态: fail  

照着这份文档 完全没办法完成这个功能

bug描述图片


9 回复

阿里云目前不支持传ReadableStream,至于你说的另外一种情况,建议你打印一下你传递body.buffer,这里只能传递buffer类型的数据


你可以看下request的日志 buffer是没问题的 [file-opration/ac1425191654596791187149132/69ms/DEBUG] body : { filepath: ‘123456.txt’, buffer: [ 100, 99, 97, 56, 100, 52, 49, 101, 101, 50, 101, 51, 101, 101, 54, 55, 55, 97, 50, 56, 99, 53, 53, 57, 53, 49, 52, 97, 52, 51, 100, 55 ] }

还是说这个buffer指的不是btye数组

顺便问一下 这个回复的时候有邮箱或者别的途径通知吗

文档里面说的,uniCloud.uploadFile貌似是上传到云存储的,无论在云函数或者客户端都是这样。顺便问问楼主解决这个问题了吗?

可以了吗,最后什么解决了,我找了半天资料了

如果想用stream可以搜一下nodejs stream转buffer。

在 uni-app 中使用 uniCloud.uploadFile 调用阿里云云存储时,如果遇到失败的情况,可能是由于多种原因导致的。以下是一些常见的排查步骤和解决方案:

1. 检查云函数配置

确保你的云函数已经正确配置了阿里云云存储的相关信息,包括 accessKeyIdaccessKeySecretbucketregion 等。

2. 检查云函数代码

确保云函数中的代码正确实现了文件上传的逻辑。以下是一个简单的示例:

const OSS = require('ali-oss');

exports.main = async (event, context) => {
  const { filePath, fileName } = event;

  const client = new OSS({
    region: 'your-region',
    accessKeyId: 'your-accessKeyId',
    accessKeySecret: 'your-accessKeySecret',
    bucket: 'your-bucket',
  });

  try {
    const result = await client.put(fileName, filePath);
    return {
      code: 0,
      message: '上传成功',
      data: result,
    };
  } catch (error) {
    return {
      code: -1,
      message: '上传失败',
      error: error.message,
    };
  }
};

3. 检查文件路径和名称

确保 filePathfileName 是正确的。filePath 应该是文件的临时路径,fileName 是文件在阿里云 OSS 中的存储路径。

4. 检查权限

确保你的阿里云 OSS 的权限设置允许上传文件。你可以通过阿里云控制台检查 bucket 的权限设置。

5. 检查网络连接

确保你的网络连接正常,能够访问阿里云 OSS 服务。

6. 查看错误日志

如果上传失败,查看云函数的错误日志,获取详细的错误信息。你可以在 uniCloud 控制台的云函数日志中查看。

7. 使用 uniCloud.uploadFile

在 uni-app 中调用云函数上传文件时,确保正确使用 uniCloud.uploadFile 方法。以下是一个示例:

uni.chooseImage({
  success: async (res) => {
    const tempFilePaths = res.tempFilePaths;
    const filePath = tempFilePaths[0];
    const fileName = 'your-file-name';

    const result = await uniCloud.uploadFile({
      filePath: filePath,
      cloudPath: fileName,
      onUploadProgress: (progressEvent) => {
        console.log('上传进度', progressEvent);
      },
    });

    if (result.code === 0) {
      console.log('上传成功', result.data);
    } else {
      console.error('上传失败', result.error);
    }
  },
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!