JS获取本地文件并进行网络传输的代码详解

 更新时间:2024年08月07日 11:50:48   作者:xump  
在web中如想要获取用户计算机上的文件我们通常会用到的方法是通过一个表单元素<input type="file">操作用户选择的文件,本文小编给大家介绍了JS获取本地文件并进行网络传输的方法,需要的朋友可以参考下

获取文件

在web中如想要获取用户计算机上的文件我们通常会用到的方法是通过一个表单元素<input type="file">操作用户选择的文件。

我们可以在js中通过监听该元素的change事件获取到文件信息,通常文件会被存放在该元素的files集合中,例如:

<input type="file">
<script>
    const files = document.querySelector('input');
    files.addEventListener('change',(e)=>{
        console.log(e.target.files);
    })
</script>

File对象

File对象中主要有以下几个常用的属性,并且都是只读属性。

  • name:在系统中的文件名。
  • size:文件大小(单位为字节)。
  • type:文件的MIME类型。
  • lastModified:文件最后修改时间。

通过我们可以通过这些文件的基本信息对选择的文件进行基本的过滤或是验证,例如:

function validateFile(file){
    const maxSize = 1 * 1024 * 1024;
    const types = ['.jpg','.jpeg','.png','.bmp','.webp','.gif'];
    const fileName = file.name.toLowerCase();
    if(file.size > maxSize){
        alert('文件过大!');
        return false;
    }
    if(!types.some((item)=>fileName.endsWith(item))){
        alert('文件类型不匹配!');
        return false;
    }
    return true;
}
files.addEventListener('change',(e)=>{
    if(!validateFile(e.target.files[0])){
        e.target.value = '';
        return;
    }
    // 后续操作...
})

在以上代码中我们通过一个函数来判断我们选择的一个文件是否符合要求以进行下一步操作,主要通过file对象上的属性判断了文件的大小和类型是否符合要求,通过不同函数我们可以过滤掉不符合我们预期的文件。

File对象上是不包含文件的内容信息的,但通常情况下我们获取到File对象上文件信息的目的是要读取到真实的文件数据信息,这时候就要借助另一个API:FileReader

FileReader

FileReader是js中提供用于读取文件数据的API,它可以从本地文件系统中读取文件数据,其读取过程是异步进行的。

FileReader对象的常用方法:

  • readAsDataURL:这个方法可以读取文件并将其内容数据转化为数据URL,结果存储到FileReader实例的result属性上。
  • readAsText:读取文件的纯文本内容,同样结果存储到FileReader实例的result属性上。
  • readAsBinaryString:读取文件的二进制信息,同样结果存储到FileReader实例的result属性上。

由于读取文件的过程是异步的,所以我们主要是通过FileReader提供的监听事件来获取文件的信息,常用的事件有三个:

  • load:文件成功加载后触发,此时可以通过result属性获取到文件信息。
  • progress:文件读取进度信息,每50ms触发一次,属性与XHR中的类似。
  • error:文件读取出错时触发,若error事件触发则load事件将不会触发。在error触发后可以通过实例上的error属性获取到错误信息,其包含一个信息码,代表的意思分别是:1(未找到文件)、2(安全错误)、3(读取被中断)、4(文件不可读)、5(编码错误)。

假设我们需要读取一张图片然后显示到页面中我们就可以进行如下操作:

const files = document.querySelector('input');
const img = document.querySelector('img');
files.addEventListener('change',(e)=>{
    let file = e.target.files[0];
    // 验证文件基本信息
    if(!validateFile(file)){
        e.target.value = '';
        return;
    }
    let reader = new FileReader();
    reader.readAsDataURL(file); // 读出文件信息并转化为URL
    reader.addEventListener('load',(e)=>{
        console.log('文件加载完成');
        img.src = e.target.result; // 将URL赋予img元素,此时e.target为reader
    })

})

文件上传

当我们在客户端获取到了文件后我们又将如何将文件上传呢?将文件上传至服务器,这必然就涉及到了网络通信,而在js中进行网络通信那自然就会用到ajax了。

利用XHR进行文件上传

进行网络通信,我们只要想到组成一个http报文就自然而然的指定该如何编写代码了,http请求主要包含了请求行、请求头、请求体三部分信息。例如我需要实现以下http报文:

POST /upload HTTP/1.1
Host:127.0.0.1:5000
Content-Type: multipart/form-data;boundary=xxx

---xxx
Content-Disposition:form-data; name="xxhh";filename="bg.jpg"
Content-Type:image/jpeg

文件数据...
--xxx--

我们就可以通过以下js进行实现

const xhr = new XMLHttpRequest();
xhr.open('POST','http://127.0.0.1:5000/upload');
const form = new FormData();
form.append('xxhh',file,'bg.jpg');
// 第一个参数对应Content-Disposition中的name
// 第二个参数为文件数据(这里是文件真实的数据并非File对象)
// 第三个为Content-Disposition中的filename,默认为本地文件名
xhr.send(form);
xhr.onload = ()=>{
    console.log(xhr.responseText); //获取到响应结果
}

我们通过open构造出请求头信息,并通过FormData这个API让我们更加简单的编写请求体信息, 它会自动将我们的请求头信息设置为Content-Type: multipart/form-data;并自动生成一个boundary,使用append方法可向其添加一个要发送字段信息,最后调用xhr.send(form)将携带数据的请求发出。

以上就是JS获取本地文件并进行网络传输的代码详解的详细内容,更多关于JS获取本地文件并传输的资料请关注脚本之家其它相关文章!

相关文章

  • JavaScript更改字符串的大小写

    JavaScript更改字符串的大小写

    在javascript中涉及字符串大小写转换的方法有4个:toLowerCase()、toLocaleLowerCase()、toUpperCase()及toLocaleUpperCase()。今天我们主要来用下toUpperCase()和toLowerCase()方法。
    2015-05-05
  • 每周一练 之 数据结构与算法(Stack)

    每周一练 之 数据结构与算法(Stack)

    这篇文章主要介绍了数据结构与算法(Stack),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • JavaScript中async和await的使用及队列详情

    JavaScript中async和await的使用及队列详情

    这篇文章主要介绍了JavaScript中async和await的使用及队列详情,主要围绕js中async和await简单解析展开面试中可能会问到的关于队列的一些场景和知识点,需要的朋友可以参考一下
    2022-07-07
  • 详解JS中? ?和?. 和||的区别

    详解JS中? ?和?. 和||的区别

    这篇文章主要介绍了详解JS中? ?和?. 和||的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • JavaScript获取网页表单提交方式的方法

    JavaScript获取网页表单提交方式的方法

    这篇文章主要介绍了JavaScript获取网页表单提交方式的方法,可判断表单提交方式是get还是post,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • 如何利用js根据坐标判断构成单个多边形是否合法

    如何利用js根据坐标判断构成单个多边形是否合法

    这篇文章主要给大家介绍了关于如何利用js根据坐标判断构成单个多边形是否合法的相关资料,文章通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • 微信小程序自定义组件components(代码详解)

    微信小程序自定义组件components(代码详解)

    这篇文章主要介绍了微信小程序自定义组件components知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-10-10
  • JavaScript中数组slice和splice的对比小结

    JavaScript中数组slice和splice的对比小结

    相信对很多学习JavaScript语言的人来说,都会经常搞不清slice和splice这两个方法。它们虽然名称相似,但是功能却完全不同。所以这篇文章就给大家详细整理了关于JavaScript中数组slice和splice的对比,有需要的可以参考学习。
    2016-09-09
  • JavaScript无提示关闭窗口(兼容IE/Firefox/Chrome)

    JavaScript无提示关闭窗口(兼容IE/Firefox/Chrome)

    JavaScript无提示关闭当前页面窗口,兼容IE/Firefox/Chrome (Close the current page window without confirm by JavaScript, support all browsers)
    2008-11-11
  • JS生成不重复的随机数组的简单实例

    JS生成不重复的随机数组的简单实例

    下面小编就为大家带来一篇JS生成不重复的随机数组的简单实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07

最新评论