/**
* 公共云函数 - 文件上传到云存储
* 参数:fileName(文件名)、fileBase64(文件base64内容)、fileType(文件类型:txt / pic / mp3)
* 返回:上传后的 cloudFileID 和访问 URL
*/
const checkRight = require('check-app-privite-key')
// 文件类型 → 上传路径映射
const CLOUD_PATH = {
txt: 'txt',
pic: 'pic',
mp3: 'mp3'
}
// 文件大小限制(字节)
const SIZE_LIMIT = {
txt: 1 * 1024 * 1024, // 1MB
pic: 5 * 1024 * 1024, // 5MB
mp3: 2 * 1024 * 1024 // 2MB
}
// 文件类型 → 允许的 MIME / 扩展名
const ALLOWED_EXT = {
txt: ['.txt'],
pic: ['.jpg', '.jpeg', '.png', '.webp', '.bmp'],
mp3: ['.mp3']
}
/**
* 获取文件扩展名
*/
function getExt(fileName) {
const idx = fileName.lastIndexOf('.')
if (idx === -1) return ''
return fileName.substring(idx).toLowerCase()
}
exports.main = async (event, context) => {
// 统一返回模板
const response = {
code: 0,
body: null,
message: 'Success.'
}
// 校验权限
const auth = (event.headers && (event.headers.Authorization || event.headers.authorization)) || ''
if (checkRight(auth)) {
response.code = -2
response.message = 'Illegal Operation.'
return response
}
// 业务逻辑
try {
// 仅允许 POST
if (event.httpMethod !== 'POST') {
response.code = -3
response.message = 'Bad Request Method.'
return response
}
// 获取参数
const body = JSON.parse(event.body) || {}
const { fileName, fileBase64, fileType } = body
// 获取路径
let path = ''
if(['.mp3', '.txt'].includes(`.${fileType}`)) {
path = fileType
} else {
if(ALLOWED_EXT.pic.includes(`.${fileType}`)) {
path = 'pic'
} else {
response.code = -4
response.message = 'fileType must be one of: .txt, .jpg, .jpeg, .png, .webp, .bmp, .mp3'
return response
}
}
// 参数校验
if (!fileName?.trim()) {
response.code = -4
response.message = 'fileName is required.'
return response
}
if (!fileBase64?.trim()) {
response.code = -4
response.message = 'fileBase64 is required.'
return response
}
// 校验文件扩展名
const ext = getExt(fileName)
if (!ALLOWED_EXT[path].includes(ext)) {
response.code = -4
response.message = `Invalid file extension for type "${fileType}". Allowed: ${ALLOWED_EXT[fileType].join(', ')}`
return response
}
// Base64 → Buffer
let fileBuffer
try {
fileBuffer = Buffer.from(fileBase64, 'base64')
} catch (_) {
response.code = -4
response.message = 'Invalid base64 content.'
return response
}
// 校验文件大小
const maxSize = SIZE_LIMIT[path]
if (fileBuffer.length > maxSize) {
response.code = -4
response.message = `File too large. Max size for ${fileType} is ${(maxSize / 1024 / 1024).toFixed(1)}MB.`
return response
}
if (fileBuffer.length === 0) {
response.code = -4
response.message = 'File is empty.'
return response
}
// 上传到云存储
const cloudPath = `${CLOUD_PATH[path]}/${fileName}`
const uploadRes = await uniCloud.uploadFile({
cloudPath,
fileContent: fileBuffer
})
if (!uploadRes.fileID) {
response.code = -6
response.message = 'Upload Failed.'
response.body = uploadRes
return response
}
// 获取临时访问 URL
const getFileRes = await uniCloud.getTempFileURL({
fileList: [uploadRes.fileID]
})
// "path/filename.txt"
response.body = getFileRes
return response
} catch (err) {
response.code = -1
response.message = err.message
return response
}
}
第三方调用【url】化的云函数,返回成功,甚至返回了【FileID】等数据,但是在相关的【控制台云存储 pic】下面没有看到上传的图片;但是有时候能够显示,有时候不能;
刚开始 是好的,后面突然就不行了;
并且,上传txt是可以的,即使上传到 【pic】下面也是可以的,唯独图片不行。
【阿里云】