云函数如下:
'use strict';
exports.main = async (event, context) => {
console.log(event)
try {
let result = await uniCloud.uploadFile(event);
return { code: 0, result }
} catch (error) {
return { code: 1, error }
}
};
app页面:
import { Buffer } from 'buffer'
const backup = 'backup.json'
const json = {a:1,b:2,c:3}
const str = JSON.stringify(json)
let buffer = Buffer.from(encodeURIComponent(str), 'utf-8')
try {
let res = await uniCloud.callFunction({
name: 'uploadFile',
data: { cloudPath: 'user/' + backup, fileContent: buffer, cloudPathAsRealPath: true }
})
if (res.result.code == 1) { throw res.result.error }
console.log('ok', res)
} catch (e) {
console.log('zzz', e)
}
云函数出错:{"code":"ValidationFailed","message":"参数校验错误: Invalid options.filePath"}
7 个回复
lazycat818 (作者)
说明一下:是阿里云
BoredApe - 有问题就会有答案。
云存储分客户端API和uniCloud云端API。APP本地上传文件请使用客户端API:https://uniapp.dcloud.net.cn/uniCloud/storage.html#uploadfile
lazycat818 (作者)
好像本地上传只能传文件吧?只有云上传才可以传内容(buffer),我的理解正确吗?
2023-10-19 11:09
lazycat818 (作者)
而且两个的参数不一样的,本地的参数是filePath,cloudPath,cloudPathAsRealPath,云端的那个参数是cloudPath,fileContent,cloudPathAsRealPath
2023-10-19 11:11
lazycat818 (作者)
说一下踩坑经历:
(1)开始只是想备份一些数据,但uniApp的android APP控制不了除自身以外的其他目录(是不是这样?)
(2)想到云存储,由于阿里云有免费的,自然采用阿里云。开始用客户端直接上传,但阿里云云存储无法直接覆盖文件,只能先删除,当cloudPathAsRealPath=true时,控制台可以看到文件分目录存储,但是不会返回fileID,覆盖报policy_does_not_allow_file_overwrite,但云端deleteFile需要传入fileID,故放弃;当cloudPathAsRealPath=false时,控制台可看到文件没有分目录保存,都在cloudstorage目录下,文件可以同名(故不会覆盖),但返回的fileID不同,可以通过fileID删除,客户端需要保存fileID。我就是怕数据丢失或损坏,才备份数据,现在又要保存fileId,保存在哪?还是离不开控制台啊。
(3)看文档有说明,云端uploadFile阿里云支持在fileContent内传文件绝对路径或buffer,那是不是可以不再客户端生成临时文件了?现在的坑就在这里。
个人感觉云存储的设计很怪,上传文件后,客户端实际上失去了控制权,要fileId干什么?我保存的路径+文件名不就是id吗?疑惑中。。。
lazycat818 (作者)
难道非得用云数据库。我只想买个自行车啊,非让我买奔驰...
DCloud_uniCloud_WYQ
代码写的有问题,客户端和云函数的通讯内容是经过序列化的,客户端的Buffer类型到云端已经丢失了,建议转base64云端再由base64还原成buffer。
关于你说的客户端失去文件控制权限的问题,设想这样一个场景,用户上传了一个需要审核的文件,审核员审核通过后用户通过文件替换把此文件替换成了一个违规文件。控制权一定不能交给客户端
lazycat818 (作者)
非常感谢,已按照您给的思路解决。我的字符串是由json序列化而来,所以不用转base64,客户端先将字符串传到云,由云函数转为buffer
2023-10-20 03:07
lazycat818 (作者)
对于阿里云,当cloudPathAsRealPath=true时,云端存储会返回fileID,客户端用uniCloud.getFileInfo({
fileList: [
https://${uniCloud.config.spaceId}.cdn.bspapp.com/${filename}
]}),可以返回url,可以借此判断文件是否存在
7***@qq.com
我也遇到了相同问题,头像同名不能覆盖,目前只能建表解决咯?出于阿里云对客户端限制