<输入类型='文件'>提供了URL编码的文件名,导致Android本机浏览器上的FileRea
<input type='file'> provides URL encoded file name, causing File Not Found error with FileReader on Android native browser
我有一个AngularJS web应用程序,我使用<file type='input' accept='image/*'>
来选择图像。
通过绑定文件输入的change
事件,使用FileReader
的readAsDataURL
方法读取它,并将结果分配给图像的src属性,我将向用户显示新选择的图像。简而言之,它看起来是这样的:
input.bind('change', function (evt) {
var fileList = evt.target.files;
if (fileList != null) {
var file = fileList.item(0),
reader = new FileReader();
reader.onloadend = function (evt) {
if (evt.target.readyState == FileReader.DONE) {
// result is assigned to src attribute of an image element
}
};
reader.onerror = function (evt) {
alert(evt.target.error.code);
};
reader.readAsDataURL(file);
}
}
这适用于:
- 当前桌面浏览器
- iOS(iOS 8.0除外,因为存在阻止从Safari上传照片和视频的已知错误)
- Chrome手机版
- 安卓系统上的大多数原生浏览器,但不是全部
例如,我在Android 4.4.2上运行的HTC One在尝试使用FileReader从存储器读取图像时,有时会出现文件未找到错误。
我发现,在这个设备上,提供的file.name
是URL编码的,将"My Image.jpg"这样的文件名转换为"My%20Image.jpg"。由于FileReader按原样使用文件名,它只是访问"错误"的、不存在的文件。此NOT_FOUND_ERR
错误不会发生在不受URL编码影响的文件名中,例如"20141028.jpg".
在将文件名传递给FileReader之前,我尝试自己对其进行URL解码,但由于File.name
是read only
属性,我无法更改它。
所以我想知道,解决提供的文件信息"错位"的最佳解决方案是什么?
这是我的案例研究,但很老套。我开发的移动Web应用Android现在可能的情况。HTML标签是
<input type='file' accept='image/*;capture=camera' onchange='open File(event)'>
它改变了。在此html标记之前不选择文件,而是在html标记之后选择。适用于Chrome和Android Chrome。感谢
- TableExport jquery插件:文件名和扩展名问题
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- 通过javascript下载文件时设置文件名
- JS-使用Ajax获取文件名
- 根据HTML文件名授予web服务器写入权限
- AngularJS-如何列出给定文件夹中的文件名
- PHP 包括 Javascript 生成的文件名
- 在csv文件名中使用西班牙语字符
- 试图在Photoshop JSX脚本中将画布大小导出为文件名
- 如何设置浏览器打开的文件对话框的文件名(一些默认值)
- 如何将动态文件名传递给ng-include
- Safari 5.1.7下载文件名未知的csv文件
- 如何在JavaScript中基于事件对象获取文件名
- 正在获取客户端计算机上特定目录中的文件名
- 使用文件夹路径名保存所有图像文件和文件名
- 如何将文件名中的斜线替换为下划线
- Javascript匹配以从URL中删除部分文件名-替换最后一次出现的内容
- 缓存JS而不更改文件名或在本地清除缓存
- 使用Javascript读取当前目录的文件名
- <输入类型='文件'>提供了URL编码的文件名,导致Android本机浏览器上的FileRea