欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
这个问题是 uni-app 在 iOS 端的一个已知问题。uni.chooseMedia 在 iOS 上返回的文件大小(size)可能不准确,显示的数值会比文件实际大小大很多。
原因分析
这是 iOS 平台下 uni.chooseMedia API 的一个 bug,返回的 tempFiles 中的 size 字段计算有误,导致显示的文件大小远超实际大小。这个问题在 ISSUE 系统中也有类似反馈,比如 uni.chooseImage 在 iOS 下拍照返回的 size 固定为 31961088(约 30MB)的问题:issues.dcloud.net.cn/pages/issues/detail?id=26309
解决方案
方案一:使用 uni.getFileInfo 获取真实大小(推荐)
在 uni.chooseMedia 的 success 回调中,使用 uni.getFileInfo 重新获取文件的真实大小:
uni.chooseMedia({
count: 9,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success(res) {
const tempFiles = res.tempFiles
const promises = tempFiles.map((file, index) => {
return new Promise((resolve, reject) => {
uni.getFileInfo({
filePath: file.tempFilePath,
success(infoRes) {
// infoRes.size 是真实的文件大小(单位:字节)
tempFiles[index].realSize = infoRes.size
resolve()
},
fail(err) {
console.error('获取文件信息失败:', err)
resolve()
}
})
})
})
Promise.all(promises).then(() => {
console.log('修正后的文件列表:', tempFiles)
// 此时可以用 realSize 替代原来的 size
})
}
})
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
注意:在 iOS 上,如果 filePath 是 file:// 协议开头的路径,uni.getFileInfo 可能会报 "file not exist" 错误,如 ISSUE 系统反馈:issues.dcloud.net.cn/pages/issues/detail?id=21036。如果遇到此情况,可以尝试方案二。
方案二:使用 plus.io API 获取文件大小(App 端可用)
在 App 平台,可以通过 plus.io API 获取文件真实大小:
uni.chooseMedia({
count: 9,
mediaType: ['image'],
sourceType: ['album', 'camera'],
success(res) {
const tempFiles = res.tempFiles
const promises = tempFiles.map((file, index) => {
return new Promise((resolve, reject) => {
// #ifdef APP-PLUS
plus.io.resolveLocalFileSystemURL(file.tempFilePath, (entry) => {
entry.getMetadata((metadata) => {
tempFiles[index].realSize = metadata.size
resolve()
}, (err) => {
console.error('获取元数据失败:', err)
resolve()
})
}, (err) => {
console.error('解析文件路径失败:', err)
resolve()
})
// #endif
})
})
Promise.all(promises).then(() => {
console.log('修正后的文件列表:', tempFiles)
})
}
})
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
方案三:使用 uni.chooseImage 替代
如果只需要选择图片,可以暂时使用 uni.chooseImage 替代 uni.chooseMedia,uni.chooseImage 在 iOS 上返回的文件大小相对准确。但需要注意,在小程序端 wx.chooseImage 已停止维护,官方推荐使用 chooseMedia。
uni.chooseImage({
count: 9,
sizeType: ['original', 'compressed'],
sourceType: ['album', 'camera'],
success(res) {
console.log(res.tempFiles) // size 相对准确
}
})
本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
方案四:上传前在后端校验
如果以上方案都无法解决,可以在文件上传到后端后,由后端返回真实的文件大小,前端再做后续处理。
总结
这是 uni-app 在 iOS 端的已知 bug,建议优先使用方案一(uni.getFileInfo)来修正文件大小。如果遇到 getFileInfo 报文件不存在的错误,则使用方案二(plus.io)作为降级方案。同时可以关注官方后续版本是否修复了此问题。
1 个回复
Ask小助手 - Ask社区AI助手
这个问题是 uni-app 在 iOS 端的一个已知问题。
uni.chooseMedia在 iOS 上返回的文件大小(size)可能不准确,显示的数值会比文件实际大小大很多。原因分析
这是 iOS 平台下
uni.chooseMediaAPI 的一个 bug,返回的tempFiles中的size字段计算有误,导致显示的文件大小远超实际大小。这个问题在 ISSUE 系统中也有类似反馈,比如uni.chooseImage在 iOS 下拍照返回的 size 固定为 31961088(约 30MB)的问题:issues.dcloud.net.cn/pages/issues/detail?id=26309解决方案
方案一:使用 uni.getFileInfo 获取真实大小(推荐)
在
uni.chooseMedia的 success 回调中,使用uni.getFileInfo重新获取文件的真实大小:注意:在 iOS 上,如果
filePath是file://协议开头的路径,uni.getFileInfo可能会报 "file not exist" 错误,如 ISSUE 系统反馈:issues.dcloud.net.cn/pages/issues/detail?id=21036。如果遇到此情况,可以尝试方案二。方案二:使用 plus.io API 获取文件大小(App 端可用)
在 App 平台,可以通过 plus.io API 获取文件真实大小:
方案三:使用 uni.chooseImage 替代
如果只需要选择图片,可以暂时使用
uni.chooseImage替代uni.chooseMedia,uni.chooseImage在 iOS 上返回的文件大小相对准确。但需要注意,在小程序端wx.chooseImage已停止维护,官方推荐使用chooseMedia。方案四:上传前在后端校验
如果以上方案都无法解决,可以在文件上传到后端后,由后端返回真实的文件大小,前端再做后续处理。
总结
这是 uni-app 在 iOS 端的已知 bug,建议优先使用方案一(
uni.getFileInfo)来修正文件大小。如果遇到getFileInfo报文件不存在的错误,则使用方案二(plus.io)作为降级方案。同时可以关注官方后续版本是否修复了此问题。要回复问题请先登录或注册
公告
更多>相关问题