彻底搞懂前端后端上传文件原理

背景:工作这么多年,一直觉得上传这块似懂非懂,每次开发时都是照着原有的记忆写的,但一直都觉得没搞懂原理,今天就彻底弄清楚到底是如何实现的。

上传文件中的关键词概念

File、Blob、ArrayBuffer、FileReader、FormData理解

分类

  1. File、Blob、ArrayBuffer是一种,属于数据类型

    Blob:二进制大对象,非js特有,是计算机通用对象,可以通过Blob构造函数创建blob对象
    File:继承Blob对象,同时也有自己特有的属性和方法,通常用在input的文件选择后的FileList对象,或者拖拽产生的DataTansfer对象,还可以通过File构造函数创建File对象。

//input上传文件
<input type="file" id="fileInput" />
<button onclick="uploadFile()">上传</button>
	function uploadFile(){
		let fileInput = document.querySelector('#fileInput')
		const file = fileInput.files[0]
		const formData = new FormData()
		formData.append('file',file)
		console.log('fileInput',formData)
	}
//拖拽文件生成File对象
			<div id="drop-zone"></div>
			dropZone.ondrop = (e)=>{
				e.preventDefault()
				const files = e.dataTransfer.files
				console.log(files)
			}

在这里插入图片描述

ArrayBuffer:是底层二进制数据,Blob是对底层二进制的封装

  1. FileReader是一个异步APi,用于读取文件并提取内容以供进一步使用,new FileReader()创建FileReader对象

  2. FormData 表示HTML表单数据的对象,new FormData([form]),特殊指出在于可以用于和服务端进行传输
    需求背景:前后端实现文件上传,前端把文件转成formData格式,传给后端,后端通过文件读取方式(如node
    的fs)解析前端数据从而拿到前端的文件

  3. Base64 一种基于64个可打印字符来表示二进制数据的表示方法
    js中有两个函数分别处理解码和编码base64字符串:
    解码:atob() 编码:btoa()

拓展

PayLoad:
Request PayLoad(请求体):指的是http的post请求或者put请求时所携带的有效数据,有三种形式分别为Request OayLoad、FormData、QueryString三种;
QueryString一般是get请求的产讯字符串,Request OayLoad、FormData是post或者put请求的请求体类型,Chrome根据content-type的值做了区分:
当值为" application/x-www-form-urlencoded"或者 multipart/form-data; boundary=----WebKitFormBoundaryBoMA1XQDUpwpxKQg 时,用的就是formData的格式数据。
content-type的值是" text/plain"或者"application/json" 时,那么,就是用的是request payload的格式传递数据。
前后端约定的传输格式要一致,否则可能会导致取不到数据的问题

这里是引用
默认的数据格式:
1、传统的ajax请求时候,Content-Type默认为"文本"类型。
2、传统的form提交的时候,Content-Type默认为application/x-www-form-urlencoded
3、axios传递字符串的时候,Content-Type默认为application/x-www-form-urlencoded
4、axios传递对象的时候,Content-Type默认为 application/json
5、axiox传递参数为formData的时候,Content-Type默认为multipart/form-data; boundary=----WebKitFormBoundarymRNA1aZLJyWA0q30

在这里插入图片描述
在这里插入图片描述

关系图

在这里插入图片描述
参考文章

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
多文件上传指的是一次上传多个文件,而不是一次只上传一个文件。下面我会分别介绍前端后端的实现方式。 前端实现: 前端通常使用HTML中的`<input type="file" multiple>`元素来实现多文件上传功能,其中`multiple`属性表示允许选择多个文件。用户选择文件后,前端会将文件信息存储在FormData对象中,然后通过ajax请求将FormData对象发送到后端。 示例代码: ```html <form id="file-form"> <input type="file" id="file-input" multiple> <button type="submit">上传文件</button> </form> <script> const form = document.getElementById('file-form'); const fileInput = document.getElementById('file-input'); form.addEventListener('submit', (e) => { e.preventDefault(); const formData = new FormData(); for (let i = 0; i < fileInput.files.length; i++) { formData.append('files', fileInput.files[i]); } fetch('/upload', { method: 'POST', body: formData }) .then(response => { console.log(response); }) .catch(error => { console.error(error); }); }); </script> ``` 后端实现: 后端通常使用框架提供的文件上传中间件来处理文件上传,例如Node.js中的`multer`中间件。后端接收到前端发送的FormData对象后,通过中间件解析出文件信息,然后将文件保存到指定目录。 示例代码(使用Express框架和multer中间件): ```javascript const express = require('express'); const multer = require('multer'); const app = express(); const upload = multer({ dest: 'uploads/' }); app.post('/upload', upload.array('files'), (req, res) => { console.log(req.files); res.send('上传成功'); }); app.listen(3000, () => { console.log('服务已启动'); }); ``` 在上面的示例中,`multer`中间件的`upload.array('files')`表示接收名为`files`的文件数组。在处理上传成功后,后端会返回一个响应,告诉前端上传成功。 需要注意的是,在上传大文件时,为了避免内存溢出,通常需要对文件进行分片上传和断点续传等优化处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值