Chrome安卓端从相册选择图片时出现ERR_UPLOAD_FILE_CHANGED与NotReadableError的技术求助
Chrome安卓端从相册选择图片时出现ERR_UPLOAD_FILE_CHANGED与NotReadableError的技术求助
各位好,我目前在开发一个React web应用,其中包含用户通过<input type="file" />上传图片的功能。这个功能在桌面浏览器和大部分移动设备上都能正常工作,但在**安卓Chrome搭配默认三星相册(也看到其他相册有类似反馈)**时,经常会在选完图片后碰到以下两个问题:
ERR_UPLOAD_FILE_CHANGEDNotReadableError: The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired.
问题细节
选完图片后,我尝试两种操作都会出问题:
- 调用
URL.createObjectURL(file) - 用
FileReader.readAsArrayBuffer()克隆文件后创建新的File对象
这些操作要么立刻失败,要么过一小段时间后失败。重新选择同一张图片还是会失败,但有时候在安卓相册里滑动浏览几张图后再选这张,就又能成功了。这让我觉得浏览器拿到的文件可能是某种临时代理或占位文件,相册还没完全解析好。
另外我注意到,安卓返回的文件名是类似168243243.jpg的临时名称,不是图片的原文件名。
我已经尝试过的方案
- 给文件读取加了重试逻辑(通过
setTimeout延迟后检查文件大小) - 用
FileReader.readAsArrayBuffer结合Blob.slice来克隆文件 - 完全弃用
URL.createObjectURL方法 - 选完图片立刻深度克隆文件,后续只操作这个副本
- 尝试重置input元素后重新让用户选择图片
- 确保
<input type="file">的accept属性正确设置为image/* - 尝试通过
Blob.slice处理文件,试图规避访问权限问题
我的猜想
这个问题看起来是部分安卓相册(比如三星)的图片访问机制导致的,我推测:
- 浏览器拿到的文件其实是临时URI或代理文件,而非真实的文件路径
- 相册应用可能没有及时解析这个代理,导致浏览器后续失去访问权限
- 问题可能和Chrome的沙箱机制、Intent处理或者Blob内存回收有关
想请教大家的问题
- 有没有靠谱的方案能解决安卓相册选图的这个兼容性问题?
- 有没有办法检测到当前拿到的文件是代理文件或者未完全解析的?
- 能不能强制安卓系统或Chrome在读取文件前就把代理完全解析好?
内容来源于stack exchange




