js 读取本地文件(必须通过input控件才能实现) 及 下载文件
js 操作 文件的实现原理:
1、js是不能直接操作(读写)文件的,html的 input[type="file"
] 控件是可以读取文件数据(获取文件数据流)的。js可以获取这个 input 标签的数据流,这样js就 可以操作 这个文件的数据流了,获取这个文件中数据了( js 还是不能 将数据写入文件中)。
input[type="file"
] 控件 操作文件,只能是用户主动 加载 文件到浏览器上。浏览器这种机制,确保了js无法 操作文件。只能在用户主动允许的情况下,将文件的数据流给 input控件。
2、input type="file" 控件文档:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input/file
3、js 获取 input中的文件流对象,里面只有几个属性(参考上面链接)。这个文件流数据是看不到,对这个文件流数据的操作,需要用对应的API接口,如下:
<input type="file" id="file"/>
var input = document.querySelector('input');
input.addEventListener('change', function() {
console.log(this.files); // 我们是无法直接在 this.files 对象中获取到 数据流的,需要使用 FileReader 对象去 读取的。
}, false);
处理 不同格式的数据流,需要使用 对应读取数据流的 API(如,文本文件,使用readAsText去读取,获取对应的文本数据;图片文件,使用readAsDataURL去读取,获取对应文件的base64的数据格式
)。
a、读取 文本文件
var input = document.querySelector('input');
input.addEventListener('change', function() {
if(this.files.length){
let file = this.files[0];
let reader = new FileReader();
reader.onload = function(){
console.log(this.result); // 文件数据流,变成相应格式数据了。( 文本文件,就输出文本内的文本数据 )
};
reader.readAsText(file);
}
}, false);
b、读取 图片文件
var input = document.querySelector('input');
input.addEventListener('change', function() {
if(this.files.length){
let file = this.files[0];
let reader = new FileReader();
reader.onload = function(){
console.log(this.result);
document.getElementById('preview').src = this.result; // this.result 输入 图片的base64格式的数据
};
reader.readAsDataURL(file);
}
}, false);
4、FileReader 属性和方法:https://www.jianshu.com/p/cde728c4e334
5、彻底弄懂文件和二进制数据的操作:https://blog.csdn.net/weixin_33807284/article/details/91420517
a、Blob 对象:Blob对象代表了一段 二进制数据 。(通过这个对象,可以生成一个存在内存中的文本文件,通过a标签下载可以这个文件。如果要生成图片等非文本的文件,比较复杂,一般也不会这么用)
b、FileList对象:<input type='file' multiple />标签 选择文件后的对象,这个对象指向 本地选中的文件。js是无法获取指向这个文件的url地址的(浏览器的安全机制)。
c、URL对象:URL对象用于生成指向File对象或Blob对象的URL。(把内存中二进制数据,看成储存在内存中的一个文件。URL对象就是这个文件的路径)
d、FileReader对象:FileReader API用于读取文件,即把文件内容读入内存。它的参数是File对象或Blob对象。(readAsText 返回文本字符串。默认文本编码格式是’UTF-8’,可以通过可选的格式参数)
个人总结:Blob 对象 和 FileList对象 都是二进制数据源。Blob 对象本身就是一个二进制数据;而FileList对象是指向一个二进制文件,可以获取到这个文件的二进制数据。
而 URL对象 和 FileReader对象 都是操作这两个 二进制数据源的 API。(FileList对象和Blob对象一样使用,因为FileList对象会隐式转化为 Blob对象)
<input type="file" id="file"/>
// URL 对象 对Blob 和 FileList 二进制数据源 操作
let blob = new Blob(["Hello World"],{ "type" : "text\/xml" }); // 本身就是二进制数据
let input = document.querySelector('input'); // 选择文件后,才有 FileList 对象。所以对input选中文件的操作,应该是input控件 change事件后。 console.log(URL.createObjectURL(blob)); // blob:null/16e3804c-452f-408b-b514-bbe27a874837 input.addEventListener('change', function() {
if(this.files.length){
let file = this.files[0];
console.log(URL.createObjectURL(file)); // blob:null/88cca1d4-442c-4ac9-a7fd-402b75990d50
}
}, false);
// FileReader 对象对Blob 和 FileList 二进制数据源 操作
let readerBlob = new FileReader();
readerBlob.onload = function(){
console.log(this.result); // Hello World
};
readerBlob.readAsText(blob); input.addEventListener('change', function() {
if(this.files.length){
let file = this.files[0];
let reader = new FileReader();
reader.onload = function(){
console.log('dd',this.result); // happy new 【这个是文本文件中的文字】
};
reader.readAsText(file);
}
}, false);
6、
个人理解:input[type="file"
] 控件,选中文件后,这个控件对象就指向这个本地文件,在需要使用这个文件时,通过相应的 API(如,FileReader 对象) 把这个对象指向的文件,读取到内存中(以二进制数据存在)。
js 操作文件 实践
一、 ajax传递文件
1、H5 FormData对象的使用——进行Ajax请求并上传文件 : https://www.cnblogs.com/lyr1213/p/6238026.html
2、js发送post请求下载文件:ajax是不能直接下载文件的,所以使用js进行post请求需要借助标签实现。 http://www.cnblogs.com/xiexingen/p/4560547.html 或 https://www.cnblogs.com/micro-chen/p/5367550.html 或 https://www.jianshu.com/p/6a9947cc3849(推荐)
二、 js通过CSV导入excel数据:https://segmentfault.com/a/1190000015080835?utm_source=tag-newest
说明:不同格式的文件,他们的本质都是二进制数据。不同 格式的文件,只是数据格式不同,针对不同的文件,使用相应的解码格式就可以获取需要的数据。
三、用户选中本地的图片,并显示这个图片。 https://segmentfault.com/a/1190000018314505
前端下载excel文件功能的三种方法 : https://www.cnblogs.com/houxiaohang/p/6846467.html
前端下载文件:
一、请求的文件url,不需要 给请求头或请求体添加信息,设置认证信息(如,请求头 添加 token值)。这种下载链接直接在浏览器地址上输入地址就可以下载,或打开。
这种请求,有 3种方式下载:
1、a 标签下载,正规下载方式。a标签上可以设置下载的文件 文件名。(一般都是这种方式下载文件)
2、location.href = downloadUrl 。这种方式下载只能是浏览器不能识别的文件。不然无法下载,而且下载的文件不能命名。
3、window.open(downloadUrl) 。 这种方式和 第二种 是一样的,只是这种方式是打开一个新的窗口跳转到下载链接,而第二种是在当前窗口跳转到下载链接。
这种请求 通过 a标签,设置down属性 就可以下载。
二、请求的文件url,需要权限控制(不管是get还是post请求都一样),这种文件的下载只能通过js的ajax请求实现。直接在浏览器上输入文件请求地址,下载不了。(后管平台中展示的数据 常常需要导出excel文件,就是这种请求)
参考:https://www.cnblogs.com/roseAT/p/11074765.html
1、因为 请求有权限,需要在请求上添加认证信息(如,请求头上添加token值),只有ajax请求可以给请求头添加信息。
2、ajax请求文件,请求回来的数据是一个二进制数据。这个请求很简单,难点是把二进制数据下载下来。这里关键是用到了 window.URL 这个API。
3、URL对象用于生成指向File对象或Blob对象的URL。通过这个API可以生成一个指向 内存中二进制数据(ajax请求回来的数据 )的url地址。这时,内存中的二进制数据就可以 和 普通文件那样下载了。
const requestFile = url => {
const xhr = new XMLHttpRequest();
// GET请求,请求路径url,async(是否异步)
xhr.open('GET', url, true);
// 设置请求头参数的方式,如果没有可忽略此行代码
xhr.setRequestHeader(AUTHORIZATION_REQUEST_HEADER, 'Token值');
// 设置响应类型为 blob
xhr.responseType = 'blob';
// 关键部分
xhr.onload = function (e) {
// 如果请求执行成功
if (this.status === 200) {
const name = xhr.getResponseHeader('Content-disposition');
const filename = name.substring(20, name.length);
const a = document.createElement('a');
// 创键临时url对象
const downloadUrl = URL.createObjectURL(this.response); a.href = downloadUrl; // 这里也可以使用location.href 或 window.open()进行下载,但是这两个不能给文件命名。
a.download = decodeURI(filename);
a.click();
// 释放之前创建的URL对象
window.URL.revokeObjectURL(downloadUrl);
}
};
// 发送请求
xhr.send();
}
总结:不同的DOM有不同的默认事件行为,一般是在点击事件时触发(如,a标签的下载行为,input-file控件打开文件系统)。js是没有这种行为的,js要实现这种行为就必须借助相应的标签。通过js触发这个标签的事件,执行相应的默认行为。
js 读取本地文件(必须通过input控件才能实现) 及 下载文件的更多相关文章
- JS ajaxfileUpload 一次性上传多个input控件 上传多个文件
本方法适用于一次性上传多个input框输入的文件,如下图所示,任务是需要一次上传两个input框提供的两个文件. 具体方法: 1.修改ajax调用方法 如上图所示,只需要将ajaxFileUpload ...
- 手工创建tomcat应用,以及实现js读取本地文件内容
手工创建tomcat应用: 1.在webapps下面新建应用目录文件夹 2.在文件夹下创建或是从其他应用中复制:META-INF,WEB-INF这两个文件夹, 其中META-INF清空里面,WEB-I ...
- 自定义type为file型input控件+该控件具有本地图片预览功能
最近的一个项目需求是写一个type为filex型的input控件,这个控件: 第一,要自定义样式: 第二,要能直接在本地预览上传的图片: 第三,要能检测图片的尺寸是否符合要求. 故综合网上的资源写了下 ...
- js读取本地图片并显示
抄自 http://blog.csdn.net/qiulei_21/article/details/52785191 js读取本地图片并显示 第一种方法比较好 版权声明:本文为博主原创文章,未经博主允 ...
- 给上传文件的input控件"美容"
作为一名前端程序猿呢,在工作中经常会遇到form表单这种东西.然而表单的其他input控件样式还是很好改变的.但是,唯独input类型是file的文件上传控件可能就没那么好打扮的漂亮.刚好菜鸟我最近工 ...
- js页面(页面上无服务端控件,且页面不刷新)实现请求一般处理程序下载文件方法
对于js页面来说,未使用服务端控件,点击下载按钮时不会触发服务端事件,且不会提交数据到服务端页面后台进行数据处理,所以要下载文件比较困难.且使用jQ的post来请求一般处理程序也不能实现文件的下载,根 ...
- 给上传文件的input控件“美容”
在工作中经常会遇到form表单这种东西.然而表单的其他input控件样式还是很好改变的.但是,唯独input类型是file的文件上传控件可能就没那么好打扮的漂亮. demo: html代码 <b ...
- Webform之FileUpload(上传按钮控件)简单介绍及下载、上传文件时图片预览
1.FileUpload上传控件:(原文:http://www.cnblogs.com/hide0511/archive/2006/09/24/513201.html) FileUpload 控件显示 ...
- 小程序中点击input控件键盘弹出时placeholder文字上移
最近做的一个小程序项目中,出现了点击input控件键盘弹出时placeholder文字上移,刚开始以为是软键盘弹出布局上移问题是传说中典型的fixed 软键盘顶起问题,因此采纳了网上搜到的" ...
随机推荐
- 框架-.NET:ASP.NET Core
ylbtech-框架-.NET:ASP.NET Core ASP.NET Core是一个免费且开放源代码的Web框架,以及由微软和社区开发的下一代ASP.NET.它是一个模块化框架,既可以Window ...
- 54、tensorflow手写识别的高级版本
''' Created on 2017年3月4日 @author: weizhen ''' import tensorflow as tf def weight_variable(shape): in ...
- Django框架(二十六)—— Django rest_framework-分页器与版本控制
目录 分页器与版本控制 一.三种分页器 二.分页器 1.普通分页(PageNumberPagination) 2.偏移分页(LimitOffsetPagination) 3.加密分页(CursorPa ...
- 【Linux】- 同步网络时间
转自:Linux同步网络时间 Linux服务器运行久时,系统时间就会存在一定的误差,一般情况下可以使用date命令进行时间设置,但在做数据库集群分片等操作时对多台机器的时间差是有要求的,此时就需要使用 ...
- java虚拟机规范(se8)——java虚拟机结构(六)
2.11 指令集简介 java虚拟机指令由一个字节的操作码,接着时0个或多个操作数组成,操作码描述了执行的操作,操作数提供了操作所需的参数或者数据.许多指令没有操作数只包含一个操作码. 如果忽略异常处 ...
- 分布式-技术专区-Redis并发竞争key的解决方案详解
Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争.这里的并发指的是多个redis的clie ...
- vue中checkbox 样式自定义重写;循环遍历checkbox,拿到不同的v-model绑定值;及获取当前checked 状态,全选和全不选等功能。
开始写这个功能,不得不吐槽原始的checkbox,灰色小方块的丑陋,虽说eleUI,mintUI,等各种框架的单复选框已经对其优化,但还是不想要这种.那我们就来研究一下怎么处理它. <secti ...
- spring security 学习三-rememberMe
功能:登录时的“记住我”功能 原理: rememberMeAuthenticationFilter在security过滤器链中的位置,在请求走认证流程是,当前边的filter都不通过时,会走remem ...
- dns轮训python
环境 python3 先安装dnspython模块 httpclient模块 resolver模块 pip install dnspython pip install hhtpclient pip i ...
- JAVA企业级应用服务器之TOMCAT实战
JAVA企业级应用服务器之TOMCAT实战 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App ...