You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Chrome安卓端从相册选择图片时出现ERR_UPLOAD_FILE_CHANGED与NotReadableError的技术求助

Chrome安卓端从相册选择图片时出现ERR_UPLOAD_FILE_CHANGED与NotReadableError的技术求助

各位好,我目前在开发一个React web应用,其中包含用户通过<input type="file" />上传图片的功能。这个功能在桌面浏览器和大部分移动设备上都能正常工作,但在**安卓Chrome搭配默认三星相册(也看到其他相册有类似反馈)**时,经常会在选完图片后碰到以下两个问题:

  • ERR_UPLOAD_FILE_CHANGED
  • NotReadableError: The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired.

问题细节

选完图片后,我尝试两种操作都会出问题:

  1. 调用URL.createObjectURL(file)
  2. FileReader.readAsArrayBuffer()克隆文件后创建新的File对象

这些操作要么立刻失败,要么过一小段时间后失败。重新选择同一张图片还是会失败,但有时候在安卓相册里滑动浏览几张图后再选这张,就又能成功了。这让我觉得浏览器拿到的文件可能是某种临时代理或占位文件,相册还没完全解析好。

另外我注意到,安卓返回的文件名是类似168243243.jpg的临时名称,不是图片的原文件名。

我已经尝试过的方案

  • 给文件读取加了重试逻辑(通过setTimeout延迟后检查文件大小)
  • FileReader.readAsArrayBuffer结合Blob.slice来克隆文件
  • 完全弃用URL.createObjectURL方法
  • 选完图片立刻深度克隆文件,后续只操作这个副本
  • 尝试重置input元素后重新让用户选择图片
  • 确保<input type="file">accept属性正确设置为image/*
  • 尝试通过Blob.slice处理文件,试图规避访问权限问题

我的猜想

这个问题看起来是部分安卓相册(比如三星)的图片访问机制导致的,我推测:

  • 浏览器拿到的文件其实是临时URI或代理文件,而非真实的文件路径
  • 相册应用可能没有及时解析这个代理,导致浏览器后续失去访问权限
  • 问题可能和Chrome的沙箱机制、Intent处理或者Blob内存回收有关

想请教大家的问题

  1. 有没有靠谱的方案能解决安卓相册选图的这个兼容性问题?
  2. 有没有办法检测到当前拿到的文件是代理文件或者未完全解析的?
  3. 能不能强制安卓系统或Chrome在读取文件前就把代理完全解析好?

内容来源于stack exchange

火山引擎 最新活动