improve pickupFile

This commit is contained in:
luk 2024-09-08 11:50:06 +08:00
parent 9e41a6d203
commit a20b281dd2

View File

@ -145,7 +145,7 @@ module.exports = {
if (/^\/static\//.test(route)) { if (/^\/static\//.test(route)) {
return route return route
} }
// 纯字母的cid // 纯数字和字母的cid
if (/^[\da-zA-Z]+$/.test(route) && envar.ipfsLens) { if (/^[\da-zA-Z]+$/.test(route) && envar.ipfsLens) {
return `${envar.ipfsLens.replace(/\/$/, '')}/${route.replace(/^\//, '')}` return `${envar.ipfsLens.replace(/\/$/, '')}/${route.replace(/^\//, '')}`
} }
@ -339,17 +339,25 @@ module.exports = {
return { _state: 'CER_EMPTY_FILE', _msg: { zhCN: '文件为空,无法上传。', enUS: 'Empty files cannot be uploaded.' } } return { _state: 'CER_EMPTY_FILE', _msg: { zhCN: '文件为空,无法上传。', enUS: 'Empty files cannot be uploaded.' } }
} else if (fileSize > (globalThis.wo?.envar?.fileSizeLimit || 10485760)) { } else if (fileSize > (globalThis.wo?.envar?.fileSizeLimit || 10485760)) {
let sizeLimitMB = parseInt((globalThis.wo?.envar?.fileSizeLimit || 10485760) / 1048576) + 'MB' let sizeLimitMB = parseInt((globalThis.wo?.envar?.fileSizeLimit || 10485760) / 1048576) + 'MB'
return { _state: 'CER_FILE_TOO_LARGE', _msg: { zhCN: `文件太大了,无法上传。最大允许 ${sizeLimitMB}`, enUS: `File too large to upload. Maximum allowed is ${sizeLimitMB}` } } return { _state: 'CER_FILE_TOO_LARGE', _msg: { zhCN: `文件大于 ${sizeLimitMB} MB无法上传`, enUS: `The file exceeds ${sizeLimitMB} MB and cannot be uploaded` } }
} }
let fileExt = filePicked?.name?.split?.('.')?.pop?.()?.toLowerCase?.() const fileName = filePicked?.name || filePath?.split?.('/')?.pop?.() // filePicked.name is available in WEB only. on the other hand, filePath 在 WEB 上并不是文件路径名,而是类似 "blob:http://localhost:8080/f0d3e54d-0694-4803-8097-641d76a10b0d“。在 iOS 上是 "_doc/uniapp_temp_1598593902955/compressed/1598593925815.png", 有时还包含从 file:/// 开始的完整路径名。
if (mediaType === 'image' && !my.isImageFile(fileExt) const fileExt = fileName?.split?.('.')?.pop?.()?.toLowerCase?.()
|| mediaType === 'video' && !my.isVideoFile(fileExt)
|| Array.isArray(mediaType) && !mediaType?.includes?.('.' + fileExt)) { if (
return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '不支持的文件:\n' + filePicked?.name, enUS: 'Unsupported file:\n' + filePicked?.name } } // #ifndef APP
// 20240830 luk: 在 App 上,就相信 iOS/Android不检查文件后缀名。
mediaType === 'image' && !my.isImageFile(fileExt) || mediaType === 'video' && !my.isVideoFile(fileExt) ||
// #endif
Array.isArray(mediaType) && !mediaType?.includes?.('.' + fileExt)) {
return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '不支持的文件类型:\n' + fileName, enUS: 'Unsupported file type:\n' + fileName } }
}
if (!filePath) {
return { _state: 'BER_FAIL_CHOOSE_FILE', _msg: { zhCN: '文件选择失败。请稍后再试,或向客服投诉。', enUS: 'File choose failed. Please try again later, or report to customer service.' } }
} }
if (filePath) {
for (let key in formData) { for (let key in formData) {
// multer 不会自动处理 JSON 数据,必须前后端配合处理 // multer 不会自动处理 JSON 数据,必须前后端配合处理
formData[key] = JSON.stringify(formData[key]) formData[key] = JSON.stringify(formData[key])
@ -378,9 +386,6 @@ module.exports = {
} else { } else {
return { _state: 'BER_FAIL_UPLOAD_FILE', _msg: { zhCN: '文件上传失败。请稍后再试,或向客服投诉。', enUS: 'File upload failed. Please try again later, or report to customer service.' }, error: errorUpload } return { _state: 'BER_FAIL_UPLOAD_FILE', _msg: { zhCN: '文件上传失败。请稍后再试,或向客服投诉。', enUS: 'File upload failed. Please try again later, or report to customer service.' }, error: errorUpload }
} }
} else {
return { _state: 'BER_FAIL_CHOOSE_FILE', _msg: { zhCN: '文件选择失败。请稍后再试,或向客服投诉。', enUS: 'File choose failed. Please try again later, or report to customer service.' } }
}
}, },
async pickupFile2Cloud ({ mediaType = 'image', count = 1, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera'], maxDuration } = {}) { async pickupFile2Cloud ({ mediaType = 'image', count = 1, sizeType = ['original', 'compressed'], sourceType = ['album', 'camera'], maxDuration } = {}) {
@ -442,15 +447,6 @@ module.exports = {
} }
fileSize = tempFiles?.[0]?.size fileSize = tempFiles?.[0]?.size
filePicked = tempFiles?.[0] filePicked = tempFiles?.[0]
let fileExt = filePicked?.name?.split?.('.')?.pop?.()?.toLowerCase?.()
if (Array.isArray(mediaType) && !mediaType?.includes?.('.' + fileExt)) {
return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '不支持的文件:\n' + filePicked?.name, enUS: 'Unsupported file:\n' + filePicked?.name } }
}
if (!fileSize) {
return { _state: 'CER_EMPTY_FILE', _msg: { zhCN: '文件为空,无法上传。', enUS: 'Empty files cannot be uploaded.' } }
}
return { _state: 'SUCCESS', fileUrl: tempFiles?.[0]?.url }
// #endif // #endif
// #ifndef WEB // #ifndef WEB
return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '请切换到网页端上传文件!', enUS: 'Please switch to WebApp to upload files.' } } return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '请切换到网页端上传文件!', enUS: 'Please switch to WebApp to upload files.' } }
@ -461,17 +457,29 @@ module.exports = {
return { _state: 'CER_EMPTY_FILE', _msg: { zhCN: '文件为空,无法上传。', enUS: 'Empty files cannot be uploaded.' } } return { _state: 'CER_EMPTY_FILE', _msg: { zhCN: '文件为空,无法上传。', enUS: 'Empty files cannot be uploaded.' } }
} else if (fileSize > (globalThis.wo?.envar?.fileSizeLimit || 10485760)) { } else if (fileSize > (globalThis.wo?.envar?.fileSizeLimit || 10485760)) {
let sizeLimitMB = parseInt((globalThis.wo?.envar?.fileSizeLimit || 10485760) / 1048576) + 'MB' let sizeLimitMB = parseInt((globalThis.wo?.envar?.fileSizeLimit || 10485760) / 1048576) + 'MB'
return { _state: 'CER_FILE_TOO_LARGE', _msg: { zhCN: `文件太大了,无法上传。最大允许 ${sizeLimitMB}`, enUS: `File too large to upload. Maximum allowed is ${sizeLimitMB}` } } return { _state: 'CER_FILE_TOO_LARGE', _msg: { zhCN: `文件大于 ${sizeLimitMB} MB无法上传`, enUS: `The file exceeds ${sizeLimitMB} MB and cannot be uploaded` } }
} }
let fileExt = filePicked?.name?.split?.('.')?.pop?.()?.toLowerCase?.() const fileName = filePicked?.name || filePath?.split?.('/')?.pop?.() // filePicked.name is available in WEB only. on the other hand, filePath 在 WEB 上并不是文件路径名,而是类似 "blob:http://localhost:8080/f0d3e54d-0694-4803-8097-641d76a10b0d“。在 iOS 上是 "_doc/uniapp_temp_1598593902955/compressed/1598593925815.png", 有时还包含从 file:/// 开始的完整路径名。
if (mediaType === 'image' && !my.isImageFile(fileExt) const fileExt = fileName?.split?.('.')?.pop?.()?.toLowerCase?.()
|| mediaType === 'video' && !my.isVideoFile(fileExt)
|| Array.isArray(mediaType) && !mediaType?.includes?.('.' + fileExt)) { if (
return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '不支持的文件:\n' + filePicked?.name, enUS: 'Unsupported file:\n' + filePicked?.name } } // #ifndef APP
// 20240830 luk: 在 App 上,就相信 iOS/Android不检查文件后缀名。
mediaType === 'image' && !my.isImageFile(fileExt) || mediaType === 'video' && !my.isVideoFile(fileExt) ||
// #endif
Array.isArray(mediaType) && !mediaType?.includes?.('.' + fileExt)) {
return { _state: 'UNSUPPORTED_FILETYPE', _msg: { zhCN: '不支持的文件类型:\n' + fileName, enUS: 'Unsupported file type:\n' + fileName } }
}
if (mediaType !== 'video' && mediaType !== 'image') { // 这一句应该在上面的 uniCloud.chooseAndUploadFile() 分支里,不过为了合用 fileSize 和 fileExt 的判断,就放在这里。
return { _state: 'SUCCESS', fileUrl: filePicked?.url }
}
if (!filePath) {
return { _state: 'BER_FAIL_CHOOSE_FILE', _msg: { zhCN: '文件上传失败。请稍后再试,或向客服投诉。', enUS: 'File upload failed. Please try again later, or report to customer service.' } }
} }
if (filePath) {
this.showLoading() this.showLoading()
const { fileID, requestId } = await uniCloud.uploadFile({ const { fileID, requestId } = await uniCloud.uploadFile({
filePath: filePath, filePath: filePath,
@ -488,8 +496,6 @@ module.exports = {
} else { } else {
return { _state: 'BER_FAIL_UPLOAD_FILE', _msg: { zhCN: '文件上传失败。请稍后再试,或向客服投诉。', enUS: 'File upload failed. Please try again later, or report to customer service.' } } return { _state: 'BER_FAIL_UPLOAD_FILE', _msg: { zhCN: '文件上传失败。请稍后再试,或向客服投诉。', enUS: 'File upload failed. Please try again later, or report to customer service.' } }
} }
}
return { _state: 'BER_FAIL_CHOOSE_FILE', _msg: { zhCN: '文件上传失败。请稍后再试,或向客服投诉。', enUS: 'File upload failed. Please try again later, or report to customer service.' } }
}, },
async pickupFile ({ async pickupFile ({
@ -616,7 +622,7 @@ module.exports = {
showModal (option = {}) { showModal (option = {}) {
option.title = this.localizeText(option.title) option.title = this.localizeText(option.title)
option.content = this.localizeText(option.content)?.substring?.(0, 100) option.content = (uni.getSystemInfoSync().uniPlatform === 'app' ? '\n' : '') + this.localizeText(option.content)?.substring?.(0, option.contentLength || 300)
if (option.content) option.content += '\n\n' if (option.content) option.content += '\n\n'
option.cancelText = this.localizeText(option.cancelText || { zhCN: '取消', enUS: 'Cancel' }) option.cancelText = this.localizeText(option.cancelText || { zhCN: '取消', enUS: 'Cancel' })
option.confirmText = this.localizeText(option.confirmText || { zhCN: '好的', enUS: 'OK' }) option.confirmText = this.localizeText(option.confirmText || { zhCN: '好的', enUS: 'OK' })
@ -772,7 +778,7 @@ module.exports = {
} }
}, },
copy_to_clipboard (text, { promptLength = 50, hidePrompt = false } = {}) { copy_to_clipboard (text, { promptLength = 50, hidePrompt = false, sysToast = false } = {}) {
text = this.localizeText?.(text) || text text = this.localizeText?.(text) || text
const self = this const self = this
uni.setClipboardData({ uni.setClipboardData({
@ -785,9 +791,12 @@ module.exports = {
} }
self.showToast?.({ self.showToast?.({
type: 'success', type: 'success',
title: `${this.localizeText?.({ zhCN: '已成功拷贝\n', enUS: 'Successfully copied\n' }) || ''}${text}`, title: `${this.localizeText?.({ zhCN: '已拷贝\n', enUS: 'Copied\n' }) || ''}${text}`,
}) })
} }
if (sysToast) {
uni.showToast({ title: this.localizeText?.({ zhCN: '已拷贝', enUS: 'Copied' }) })
}
}, },
}) })
}, },