云存儲的上傳方式有3種:
○ web界面:即在https://unicloud.dcloud.net.cn/ web控制臺妆艘,點擊云存儲佛纫,通過web界面進行文件上傳。該管理界面同時提供了資源瀏覽傅物、刪除等操作界面。
○ 客戶端API或組件上傳:在前端js中編寫uniCloud.uploadFile,或者使用uni ui的FilePicker組件饶唤,文件選擇+上傳均封裝完畢蓝翰。
○云函數(shù)上傳文件到云存儲:即在云函數(shù)js中編寫uniCloud.uploadFile
注意:
○ 前端和云函數(shù)端光绕,均有一個相同名稱的api:uniCloud.uploadFile。請不要混淆畜份。
○ 前端還有一個uni.uploadFile的API诞帐,那個API用于連接非uniCloud的上傳使用。請不要混淆爆雹。
○ 在使用騰訊云時如果訪問云存儲文件提示The requested URL '/1123.jpg' was not found on this server這種錯誤停蕉,一般是cdn流量用盡導(dǎo)致的「铺可以升級配置或轉(zhuǎn)為按量計費(目前僅企業(yè)類型認證的賬號可以使用按量計費的服務(wù)空間)慧起。
○ 在允許用戶上傳圖片的應(yīng)用里,違規(guī)檢測是必不可少的册倒,為此uniCloud提供了內(nèi)容安全檢測模塊健爬,可以很方便的實現(xiàn)圖片鑒黃等功能桐早。詳情參考:內(nèi)容安全
阿里云的云存儲有一些限制:
○ 不支持目錄(弱智)
○ 同名文件上傳也是按新文件名對待歉摧,不會覆蓋
○ 文件沒有讀權(quán)限控制牡彻,任意人知道路徑都可以讀。
○ 騰訊云沒有上述限制崇呵。
客戶端API
uploadFile(Object object)
請求參數(shù)
注意
○ 使用阿里云時缤剧,cloudPath為云端文件名,請勿使用非法字符
○ 騰訊云cloudPath 為文件的絕對路徑域慷,包含文件名 foo/bar.jpg荒辕、foo/bar/baz.jpg 等,不能包含除[0-9 , a-z , A-Z]犹褒、/抵窒、!、-化漆、_估脆、.、座云、*和中文以外的字符疙赠,使用 / 字符來實現(xiàn)類似傳統(tǒng)文件系統(tǒng)的層級結(jié)構(gòu)付材。
○ 騰訊云cloudPath為文件標(biāo)識,相同的cloudPath會覆蓋圃阳,如果沒有權(quán)限覆蓋則會上傳失敗厌衔。阿里云以自動生成的ID為文件標(biāo)識,不會存在覆蓋問題
○ 阿里云目前由于安全原因暫時禁止云存儲內(nèi)上傳html文件
○ 上傳文件超時時間可以在項目manifest.json內(nèi)進行配置
響應(yīng)參數(shù)
示例代碼:
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)
在云函數(shù)中富寿,把文件的fileid轉(zhuǎn)換為臨時URL。臨時URL有有效期限制锣夹,避免其他人獲取URL后可以持續(xù)訪問該文件页徐。
請求參數(shù)
響應(yīng)參數(shù)
示例代碼:
// 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界面選擇文件(圖片/視頻)并直接上傳到云存儲银萍。
同時提供了選擇回調(diào)事件变勇,方便對選擇后的圖片進行壓縮等二次處理,然后再上傳贴唇。
請求參數(shù)
type:'image'|'video'|'all'
回調(diào)方法
onChooseFile(Object OnChooseFileRes)
選擇圖片的回調(diào)事件搀绣。方便對選擇后的圖片進行壓縮、裁剪等二次處理戳气,然后再上傳链患。
OnUploadProgress(Object OnUploadProgressRes)
上傳進度的回調(diào)
OnUploadProgressRes結(jié)構(gòu)如下
{
index: 0, // 觸發(fā)此回調(diào)的文件序號
loaded: 256, // 已上傳大小
total: 1024, // 總大小
tempFilePath: '', // 本地臨時文件路徑
tempFile: {} // 本地文件對象
}
示例:
function cropImg(file) {
return new Promise((resolve, reject) => {
let ext
let filePathProcessed = file.path // 處理結(jié)果
// #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)
})
云函數(shù)API
文件上傳
uniCloud.uploadFile(Object uploadFileOptions)
uploadFileOptions參數(shù)說明
響應(yīng)參數(shù)
示例
// 云函數(shù)上傳文件示例代碼
const fs = require("fs");
let result = await uniCloud.uploadFile({
cloudPath: "test-admin.jpeg",
fileContent: fs.createReadStream(`${__dirname}/cos.jpeg`)
});
刪除文件
uniCloud.deleteFile(Object deleteFileOptions)
deleteFileOptions參數(shù)說明
響應(yīng)參數(shù)
示例代碼
// 云函數(shù)刪除文件示例代碼
let result = await uniCloud.deleteFile({
fileList: [
"cloud://test-28farb/a.png" // 阿里云fileID是url形式瓶您,例:https://xxx.com/xxx.png
]
});
文件下載
uniCloud.downloadFile(Object downloadFileOptions)
云函數(shù)下載已上傳至云開發(fā)的文件至本地(默認本地根目錄/root)
阿里云不支持麻捻,騰訊云支持該方法
downloadFileOptions參數(shù)說明
響應(yīng)參數(shù)
示例代碼
let result = await uniCloud.downloadFile({
fileID: "cloud://aa-99j9f/my-photo.png",
// tempFilePath: '/tmp/test/storage/my-photo.png'
});