位置: IT常识 - 正文

前端文件的上传与下载(前端文件的上传和下载)

编辑:rootadmin
前端文件的上传与下载

推荐整理分享前端文件的上传与下载(前端文件的上传和下载),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:前端文件上传下载的功能实现,前端文件上传进度条,前端文件上传怎么实现,前端文件的上传功能,前端文件的上传和下载,前端文件的上传下载,前端文件的上传方式,前端文件的上传下载,内容如对您有帮助,希望把文章链接给更多的朋友!

简单理解一下前端文件的上传与下载,如有错误,轻喷。

http小知识

http协议是建立在tcp、ip协议的应用层规范。

http协议规范把http请求分为3个部分:状态行,请求头,请求体。所有的方法、实现,都是围绕 “如何运用和组织这三部分” 来完成的。

http里没有专门用于文件上传的请求方式,文件上传请求是在post请求基础之上定义出来的一种方式。

http协议规定 POST 请求提交的数据,必须放在消息主体(entity-body)中,但协议并没有规定消息主体的编码方式 。开发者可以自己决定消息主体的编码格式,只要最后发送的 HTTP 请求,满足上面的格式就可以。

数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。

http全名超文本传输协议(Hyper Text Transfer Protocol,HTTP),顾名思义:用来传输文本的协议,那么当我们产生的传输文件的需求时,就显得“捉襟见肘”。

在发送表单时,输入的都是文本信息,但是很多人不理解,输出文件时,文件的信息根本没有我们想要的数据,那到底怎么才能传输? 在原生的html中,我们通过form表单进行提交。而当我们需要对表单数据进行二次处理再进行发送时,就需要通过JavaScript脚本进行发送,那么这时候FormData对象就派上了用场。

而实际上,通过FormData对象提交表单仅仅是form表单提交的一种方式,这与通过设置form标签的enctype进行提交是一样的效果。

FormData允许以二进制binary的方式传递文件,那么,既然是二进制数据,自然可以通过http进行传输。

客户端提交文件通过form标签进行提交

这是最原始的提交方式。但是要注意,http请求头中有一个Content-Type属性,该属性指定数据以何种形式进行编码传递,默认是“application/x-www-form-urlencoded”,以键值对的形式进行传递:key1=val1&key2=val2。

如果我们默认以“application/x-www-form-urlencoded”作为请求头,那么显然文件不可能变成其中的value进行传递。

我们可以通过设置form标签的“enctype”属性来指定“content-type”,该属性取值如下:

application/x-www-form-urlencoded: 初始的默认值multipart/form-data: 适用于使用 标签上传文件text/plain: HTML5 引入的类型

这是简单请求的三种请求头,当然现在还可以使用“application/json”。

给form标签添加“ enctype=“multipart/form-data””属性与属性值。

<form action="http://localhost:4000/upload/logo" method="post" target="_blank" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="提交"></form>

此时发送请求,请求标头中的“Content-Type”变成”“multipart/form-data; boundary=----WebKitFormBoundaryU9sq3PNe4bAowjQG“。

其中boundary是一个占位符,代表我们规定的分割符,可以自己任意规定,但为了避免和正常文本重复了,尽量要使用复杂一点的内容。

通过FormData提交

这可能是最常见的方式了。

通过FormData构造函数直接从form标签生成。

<form id="form" action="http://localhost:4000/upload/logo" method="post" target="_blank" enctype="multipart/form-data"> <input id="file" type="file" name="file"> <input id="button" type="button" value="提交"></form><script> function submitForm(e) { // 通过表单直接转换 const fd = new FormData(document.querySelector('#form')); const xhr = new XMLHttpRequest(); xhr.open('POST', 'http://localhost:4000/upload/logo', true); xhr.send(fd); } document.querySelector('#button').addEventListener('click', submitForm)</script>服务端发送文件

当我们将文件发送至服务器之后,由服务端自行接收并保存。

当客户端需要下载文件时,服务端又得将保存的文件进行读取并返回。

这里通过nodejs的express框架进行文件的读取与返回。

app.get('/file', (req, res) => { const file = fs.readFileSync('./upload/logo.jpg', ) res.setHeader('content-type','binary'); res.send(file)})app.get('/file1', (req, res) => { res.sendFile(path.resolve(__dirname,'./upload/logo.jpg'))})

这里res对象返回数据有多种方式,如果直接使用sendFile则不需要设置响应头,如果是使用send/end等方法需要手动设置响应头为“binary”表示二进制。

客户端接收文件

在axios响应拦截器中添加判断,如果返回data类型为“Blob”,则直接将二进制数据返回,注意此处根据具体项目配置。 发送请求

export async function queryFile(){ return await http.get('/file1',{ params: { site_id: 4 }, responseType: 'blob' })}前端文件的上传与下载(前端文件的上传和下载)

注意此处的responseType被手动设置成“blob”,参考axios文档,该值为浏览器专属。

接收完毕开始下载文件,这里用到的技术点最多,也是最容易让人头疼的地方。

const blob = new Blob([res],{ type: 'image/jpeg'});const url = URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'logo.jpg'document.body.append(a);a.click();document.body.remove(a);URL.revokeObjectURL(src);首先说说Blob

Blob 对象表示一个二进制文件的数据内容,比如一个图片文件的内容就可以通过 Blob 对象读写。它通常用来读写文件,它的名字是 Binary Large Object (二进制大型对象)的缩写。

Blob构造函数接受两个参数。第一个参数是数组,成员是字符串或二进制对象,表示新生成的Blob实例对象的内容;第二个参数是可选的,是一个配置对象,目前只有一个属性type,它的值是一个字符串,表示数据的 MIME 类型,默认是空字符串。

第一个参数是一个由ArrayBuffer, ArrayBufferView, Blob, DOMString 等对象构成的 Array ,或者其他类似对象的混合体。

MIME参考

那么,此时使用Blob构造函数生成一个blob对象,用来表示二进制文件的数据内容,可通过该实例进行读写,一般我们不需要对文件进行读写,毕竟你也不会去修改图片的二进制信息。

那这个Blob对象到底有什么用?接着看下面。

再看看URL.createObjectURL

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的 URL。

它接收一个参数,该参数可以是File对象、Blob对象或者MediaSource对象,返回一个用于指定源object的内容。

等等!Blob对象?这下就能理解,为什么要创建Blob对象了。因为要生成特定的URL用于下载。

最后需要注意的是,每次调用 createObjectURL() 方法时,都会创建一个新的 URL 对象,即使你已经用相同的对象作为参数创建过。当不再需要这些 URL 对象时,每个对象必须通过调用 URL.revokeObjectURL() 方法来释放。

这下,从发送文件到下载文件就连贯起来了,下次不用再去百度“前端怎么下载二进制文件流”啦。

其实,也不需要使用Blob

不知道有没有发现,在响应拦截器中的判断类型,是判断data是否是Blob对象,已经是Blob对象了?因为我们设置了responseType为blob,既然这样,那岂不是可以省略代码中new Blob这一步?

待考证实际情况,我这里是可以省略的

const url = URL.createObjectURL(data);const a = document.createElement('a');a.href = url;a.download = 'logo.jpg'document.body.append(a);a.click();document.body.remove(a);URL.revokeObjectURL(src);axios的responseType

如果仔细看看axios文档会发现,该属性有多种取值。

{ // ...... // `responseType` 表示浏览器将要响应的数据类型 // 选项包括: 'arraybuffer', 'document', 'json', 'text', 'stream' // 浏览器专属:'blob' responseType: 'json', // 默认值}

其中有一个“arraybuffer”,那这个arraybuffer又是什么东西?

在上面服务端发送文件中,写到两种方式,第一种是通过文件系统的readFileSync进行文件的读取,参考Nodejs官网,fs.readFileSync。

可以发现,这个方法读取文件的返回值默认是Buffer对象:

那么如果把responseType改为arraybuffer是否也可以?

export async function queryFile(){ return await http.get('/file',{ params: { site_id: 4 }, responseType: 'arraybuffer' })}

注意,此时responseType改为“arraybuffer“之后,拦截器中对返回值类型的判断会发生变化:

那么,在生成URL的时候,就必须先通过new Blob进行转换了。

综上

文件上传与下载并不是很难理解的东西,关键点在于其中用到的知识点比较多,从上传的FormData、form标签的enctype属性到下载时接收的数据类型等,哪怕有一步出现问题都会出错,而且无法找到错误位置,毕竟,下面两个玩意,一般人也看不懂。

参考

http上传文件

常见 MIME 类型列表

Blob对象

axios-请求配置

express-res

本文链接地址:https://www.jiuchutong.com/zhishi/299117.html 转载请保留说明!

上一篇:[JAVA]继承(java继承的基本概念)

下一篇:初识React及React开发依赖介绍(react基础入门)

  • 微信有年度总结账单吗(微信年度总结报告在哪看)

    微信有年度总结账单吗(微信年度总结报告在哪看)

  • 微信如何查全年消费总额(微信如何查全年转账记录)

    微信如何查全年消费总额(微信如何查全年转账记录)

  • opporeno4支持防水吗(oppo reno 4防水)

    opporeno4支持防水吗(oppo reno 4防水)

  • 苹果手机最上面一行时间不显示了(苹果手机最上面的横槽是什么)

    苹果手机最上面一行时间不显示了(苹果手机最上面的横槽是什么)

  • win7开机黑屏出现英文(win7开机黑屏出现英文怎么解决)

    win7开机黑屏出现英文(win7开机黑屏出现英文怎么解决)

  • 微信发语音邀请总是显示对方拒绝是怎么回事(微信发语音邀请怎么取消)

    微信发语音邀请总是显示对方拒绝是怎么回事(微信发语音邀请怎么取消)

  • 微信性别怎么修改为空(微信性别在哪修改)

    微信性别怎么修改为空(微信性别在哪修改)

  • 克拉克拉直播可以回放吗(克拉克拉直播可以横屏吗)

    克拉克拉直播可以回放吗(克拉克拉直播可以横屏吗)

  • 为什么优学院账号登不上去(优学院的账号是什么)

    为什么优学院账号登不上去(优学院的账号是什么)

  • 电脑发热自动关机怎么回事(电脑发热自动关机是处理器还是主板问题)

    电脑发热自动关机怎么回事(电脑发热自动关机是处理器还是主板问题)

  • 抖音直播间本场点赞是什么意思(抖音直播间本场点赞有什么用)

    抖音直播间本场点赞是什么意思(抖音直播间本场点赞有什么用)

  • cdrom属于什么存储器(cd-rom是内存储器吗)

    cdrom属于什么存储器(cd-rom是内存储器吗)

  • b站混剪算自制吗(b站做混剪能赚钱吗)

    b站混剪算自制吗(b站做混剪能赚钱吗)

  • 华为手机导航用的是北斗还是gps(华为手机导航用的什么系统)

    华为手机导航用的是北斗还是gps(华为手机导航用的什么系统)

  • ipadair2有笔吗(ipadair2有手写笔吗)

    ipadair2有笔吗(ipadair2有手写笔吗)

  • 设置黑名单后可以收到短信吗(设置黑名单可以打的过去吗)

    设置黑名单后可以收到短信吗(设置黑名单可以打的过去吗)

  • c语言中f是什么意思(c语言f是什么意思)

    c语言中f是什么意思(c语言f是什么意思)

  • ipad需要清理垃圾吗(ipad要清理缓存吗)

    ipad需要清理垃圾吗(ipad要清理缓存吗)

  • 11支持双卡吗(iphone14pro支持双卡吗)

    11支持双卡吗(iphone14pro支持双卡吗)

  • ypbpr是什么接口(ypbpr是什么接口,干什么的)

    ypbpr是什么接口(ypbpr是什么接口,干什么的)

  • 怎么看特别关心我的人(qq空间怎么看特别关心)

    怎么看特别关心我的人(qq空间怎么看特别关心)

  • 快手播放量低如何恢复(快手的播放量很少)

    快手播放量低如何恢复(快手的播放量很少)

  • tiktok怎么下载(苹果tiktok怎么下载)

    tiktok怎么下载(苹果tiktok怎么下载)

  • iphonexr使用技巧(iphonexr使用说明视频教程)

    iphonexr使用技巧(iphonexr使用说明视频教程)

  • 金立s9怎么刷机(金立s9刷机包官方)

    金立s9怎么刷机(金立s9刷机包官方)

  • qq电话怎么静音(qq电话怎么静音拨打电话)

    qq电话怎么静音(qq电话怎么静音拨打电话)

  • 去掉开机显示BIOS里的英文内容要一分多钟时间的方法(电脑开机显示怎么取消?)

    去掉开机显示BIOS里的英文内容要一分多钟时间的方法(电脑开机显示怎么取消?)

  • ChatGPT-4 终于来了(文末附免费体验地址)

    ChatGPT-4 终于来了(文末附免费体验地址)

  • 微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)(微信小程序开发平台)

    微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)(微信小程序开发平台)

  • phpcms不能生成首页怎么办(phpcms编辑器)

    phpcms不能生成首页怎么办(phpcms编辑器)

  • 应纳税所得额是利润总额吗
  • 免税收入是什么票据类型
  • 税负怎么计算
  • 差旅费抵税怎么算
  • 银行代扣的社保怎么查询
  • 未分配利润期末余额在借方还是贷方
  • 销售企业资金风险点有哪些呢
  • 企业将自用设备进行出租
  • 产品成本科目包括
  • 营改增后建筑公司自建行为所得税
  • 如何查询增值税申报表
  • 电子发票详见清单怎么开
  • 税控盘抵扣政策依据
  • 没有成本票如何做账
  • 网上认证增值税专用发票步骤图解
  • 办税人员需要会计证吗
  • 0申报逾期罚款
  • 分支机构年度终了必须由总机构负责合并汇总纳税吗?
  • 企业所得税税率2.5% 5% 25%
  • 月末进项税额结转会计分录
  • 酒店行业增值税加计抵减是10%还是15%
  • 新版edge浏览器文字不显示
  • 电脑开机黑屏没信号怎么回事
  • 上年发生的费用,下年来得发票,会计分录
  • 注册表怎么启动
  • php递归函数遍历数组
  • php的八种类型
  • 利息补偿金怎么算
  • php使用oci8扩展连接oracle
  • 物业公司购买空调合法吗
  • 罚款支出计入什么
  • 机器学习论文源代码浅读:Autoformer
  • 阿里云主机php版本
  • 外地工程预缴税款怎么入账啊
  • 天猫一般纳税人如何纳税
  • 合同发票收款付款管理系统源码
  • 发生售后维修领用材料分录
  • 案例详解:功能点估算法
  • 怎么计算多个表格的某一数据
  • 个人转帐多少不引起注意
  • 其他应收款增加现金流量表怎么填
  • 广告制作费怎么入账
  • 房屋租赁税缴纳时间
  • 扣供应商的货款进项税要转出吗
  • 小规模纳税人免税会计分录
  • 非营利组织如何盈利
  • 财务软件是有哪些软件
  • 转让负债 增值税
  • 应交税费会计核算
  • 个人承担社保如何办理
  • 因质量原因无法退货
  • 库存现金多出来怎么调账
  • 三栏式明细账适用于总分类账
  • 会计凭证审核的主要内容
  • 个体工商户可以变更法人吗
  • 销售部购买电脑一台分录
  • 账簿凭证的管理要求
  • Transact_SQL 小手册
  • win7操作系统中将打开窗口拖动到屏幕顶端
  • win2000系统安装教程
  • macbook如何安装苹果系统
  • gwsloader.exe是什么意思
  • window8.1
  • ghost10008解决办法
  • win10没空间
  • linux搭建chia
  • jquery教程
  • kotlin开发安卓教程
  • 常用adb命令大全
  • Android开源ui框架
  • asp.net runat
  • linux命令scp和sftp详细介绍
  • jquery的show和hide
  • android 加载更多
  • html5 jquery
  • 公司开票明细如何查询
  • 青岛市国家税务局官方网站
  • 收到发票需要代签吗
  • 广西怎么查社保记录
  • 省银保监局长是什么级别
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设