张小怂
张小怂
  • 发布:2026-06-11 14:36
  • 更新:2026-06-11 14:36
  • 阅读:26

uni.chooseMedia在IOS端选择图片,获取的文件大小比文件实际的大小,大了很多

分类:uni-app

uni.chooseMedia在IOS端选择图片的时候。图片文件只有几百KB,但是uni.chooseMedia返回的文件大小,却有十几MB

2026-06-11 14:36 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( 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 上,如果 filePathfile:// 协议开头的路径,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.chooseMediauni.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)作为降级方案。同时可以关注官方后续版本是否修复了此问题。

内容为 AI 生成,仅供参考

要回复问题请先登录注册