uni-app uniCloud.uploadFile 云函数 调用 阿里云云存储 失败
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] 参数校验错误: filePath和fileBuffer不能都为空
Error: 参数校验错误: filePath和fileBuffer不能都为空
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
照着这份文档 完全没办法完成这个功能
阿里云目前不支持传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. 检查云函数配置
确保你的云函数已经正确配置了阿里云云存储的相关信息,包括 accessKeyId
、accessKeySecret
、bucket
和 region
等。
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. 检查文件路径和名称
确保 filePath
和 fileName
是正确的。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);
}
},
});