当前位置: 代码网 > it编程>编程语言>Javascript > JS获取本地文件并进行网络传输的代码详解

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

2024年09月08日 Javascript 我要评论
获取文件在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获取本地文件并传输的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com