云存储的上传方式有3种:
○ web界面:即在https://unicloud.dcloud.net.cn/ web控制台,点击云存储,通过web界面进行文件上传。该管理界面同时提供了资源浏览、删除等操作界面。
○ 客户端API或组件上传:在前端js中编写uniCloud.uploadFile,或者使用uni ui的FilePicker组件,文件选择+上传均封装完毕。
○云函数上传文件到云存储:即在云函数js中编写uniCloud.uploadFile
注意:
○ 前端和云函数端,均有一个相同名称的api:uniCloud.uploadFile。请不要混淆。
○ 前端还有一个uni.uploadFile的API,那个API用于连接非uniCloud的上传使用。请不要混淆。
○ 在使用腾讯云时如果访问云存储文件提示The requested URL '/1123.jpg' was not found on this server这种错误,一般是cdn流量用尽导致的。可以升级配置或转为按量计费(目前仅企业类型认证的账号可以使用按量计费的服务空间)。
○ 在允许用户上传图片的应用里,违规检测是必不可少的,为此uniCloud提供了内容安全检测模块,可以很方便的实现图片鉴黄等功能。详情参考:内容安全
阿里云的云存储有一些限制:
○ 不支持目录(弱智)
○ 同名文件上传也是按新文件名对待,不会覆盖
○ 文件没有读权限控制,任意人知道路径都可以读。
○ 腾讯云没有上述限制。
客户端API
uploadFile(Object object)
请求参数
注意
○ 使用阿里云时,cloudPath为云端文件名,请勿使用非法字符
○ 腾讯云cloudPath 为文件的绝对路径,包含文件名 foo/bar.jpg、foo/bar/baz.jpg 等,不能包含除[0-9 , a-z , A-Z]、/、!、-、_、.、、*和中文以外的字符,使用 / 字符来实现类似传统文件系统的层级结构。
○ 腾讯云cloudPath为文件标识,相同的cloudPath会覆盖,如果没有权限覆盖则会上传失败。阿里云以自动生成的ID为文件标识,不会存在覆盖问题
○ 阿里云目前由于安全原因暂时禁止云存储内上传html文件
○ 上传文件超时时间可以在项目manifest.json内进行配置
响应参数
示例代码:
uni.chooseImage({
count: 1,
success(res) {
console.log(res);
if (res.tempFilePaths.length > 0) {
let filePath = res.tempFilePaths[0]
//进行上传操作
// promise方式
const result = await uniCloud.uploadFile({
filePath: filePath,
cloudPath: 'a.jpg',
onUploadProgress: function(progressEvent) {
console.log(progressEvent);
var percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
}
});
// callback方式,与promise方式二选一即可
uniCloud.uploadFile({
filePath: filePath,
cloudPath: 'a.jpg',
onUploadProgress: function(progressEvent) {
console.log(progressEvent);
var percentCompleted = Math.round(
(progressEvent.loaded * 100) / progressEvent.total
);
},
success() {},
fail() {},
complete() {}
});
}
}
});
getTempFileURL(Object object)
在云函数中,把文件的fileid转换为临时URL。临时URL有有效期限制,避免其他人获取URL后可以持续访问该文件。
请求参数
响应参数
示例代码:
// promise方式
uniCloud.getTempFileURL({
fileList: ['cloud://test-28farb/a.png']
})
.then(res => {});
// callback方式,与promise方式二选一
uniCloud.getTempFileURL({
fileList: ['cloud://test-28farb/a.png'],
success() {},
fail() {},
complete() {}
});
chooseAndUploadFile(Object object)
通过ui界面选择文件(图片/视频)并直接上传到云存储。
同时提供了选择回调事件,方便对选择后的图片进行压缩等二次处理,然后再上传。
请求参数
type:'image'|'video'|'all'
回调方法
onChooseFile(Object OnChooseFileRes)
选择图片的回调事件。方便对选择后的图片进行压缩、裁剪等二次处理,然后再上传。
OnUploadProgress(Object OnUploadProgressRes)
上传进度的回调
OnUploadProgressRes结构如下
{
index: 0, // 触发此回调的文件序号
loaded: 256, // 已上传大小
total: 1024, // 总大小
tempFilePath: '', // 本地临时文件路径
tempFile: {} // 本地文件对象
}
示例:
function cropImg(file) {
return new Promise((resolve, reject) => {
let ext
let filePathProcessed = file.path // 处理结果
// #ifdef H5
ext = file.name.split('.').pop()
resolve({
path: filePathProcessed,
ext,
fileType: file.fileType
})
// #endif
// #ifndef H5
uni.getImageInfo({
src: file.path,
success(info) {
ext = info.type.toLowerCase()
resolve({
path: filePathProcessed,
ext,
fileType: file.fileType
})
},
fail(err) {
reject(new Error(err.errMsg || '未能获取图片类型'))
}
})
// #endif
})
}
uniCloud.chooseAndUploadFile({
type: 'image',
onChooseFile(res) {
const processAll = []
for (let i = 0; i < res.tempFiles.length; i++) {
processAll.push(cropImg(res.tempFiles[i]))
}
return Promise.all(processAll).then((fileList) => {
let result = {
tempFilePaths: []
}
result.tempFiles = fileList.map((fileItem, index) => {
result.tempFilePaths.push(fileItem.path)
return {
path: fileItem.path,
cloudPath: '' + Date.now() + index + '.' + fileItem.ext, // 云端路径,这里随便生成了一个
fileType: fileItem.fileType
}
})
return result
})
}
}).then(res => {
console.log(res)
})
云函数API
文件上传
uniCloud.uploadFile(Object uploadFileOptions)
uploadFileOptions参数说明
响应参数
示例
// 云函数上传文件示例代码
const fs = require("fs");
let result = await uniCloud.uploadFile({
cloudPath: "test-admin.jpeg",
fileContent: fs.createReadStream(`${__dirname}/cos.jpeg`)
});
删除文件
uniCloud.deleteFile(Object deleteFileOptions)
deleteFileOptions参数说明
响应参数
示例代码
// 云函数删除文件示例代码
let result = await uniCloud.deleteFile({
fileList: [
"cloud://test-28farb/a.png" // 阿里云fileID是url形式,例:https://xxx.com/xxx.png
]
});
文件下载
uniCloud.downloadFile(Object downloadFileOptions)
云函数下载已上传至云开发的文件至本地(默认本地根目录/root)
阿里云不支持,腾讯云支持该方法
downloadFileOptions参数说明
响应参数
示例代码
let result = await uniCloud.downloadFile({
fileID: "cloud://aa-99j9f/my-photo.png",
// tempFilePath: '/tmp/test/storage/my-photo.png'
});