前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试题:我现在上传图片的时候提前预览到图片怎么办?

面试题:我现在上传图片的时候提前预览到图片怎么办?

作者头像
用户7413032
发布于 2020-06-11 08:16:37
发布于 2020-06-11 08:16:37
1.6K00
代码可运行
举报
文章被收录于专栏:佛曰不可说丶佛曰不可说丶
运行总次数:0
代码可运行

今天我也来标题党一会,用“面试题”蹭一蹭热度,主要还行想深度剖析一下,文件上传,里面的门道。

1、在web上怎么实现文件上传

在我们使用的各种类库,框架中文件上传长相多样,百花齐放,但是归根结底还是离不开一个input标签,据我所知,所有的文件上传都是 html(如有别的方式请大佬指正) input标签 来实现上传,写法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<input type="file" id="file" />

长相如下:

我们发现最原始的的上传,其实就就张这样,朴实无华,后来的那些框架和库,其实就是隐藏了这个朴实无华的input 而加入了很多华丽的样式,来操纵这个input

比如你看饿了么的这个上传改的相当的花里胡哨,那我们上传之后会得到什么呢?如下图:

其实这个input的dom对象下面会有个fileList对象,上传之后会存储当前这个文件的所有信息,实际上,这个fileLlist,就是一个blob对象,

什么是blob对象

Blob,Binary Large Object的缩写,代表二进制类型的大对象。Blob的概念在一些数据库中有使用到,例如,MYSQL中的BLOB类型就表示二进制数据的容器。在Web中,Blob类型的对象表示不可变的类似文件对象的原始数据,通俗点说,就是Blob对象是二进制数据的容器,用直观的方式去描述这个二进制数据 实际上这个fileList就是一个特殊的blob对象

blob如何使用呢?

构建一个Blob对象通常有三种方式:

1、通过Blob对象的构造函数来构建。

2、从已有的Blob对象调用slice接口切出一个新的Blob对象。

3、canvas API toBlob方法,把当前绘制信息转为一个Blob对象。

下面只看第一种的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//构造函数来构建
var blob = new Blob(array[optional], options[optional]);

构造函数,接受两个参数

第一个参数:为一个数据序列,可以是任意格式的值,例如,任意数量的字符串,Blobs 以及 ArrayBuffers。 第二个参数:用于指定将要放入Blob中的数据的类型(MIME)(后端可以通过枚举MimeType,获取对应类型

Blob对象的基本属性:

size :Blob对象包含的字节数。(只读)

type : Blob对象包含的数据类型MIME,如果类型未知则返回空字符串。

Blob对象的基本方法:

大文件分割 (slice() 方法),slice方法与数组的slice类似。

此时一个blob对象就创建好了,在上一部分中,我说fileList是个特殊的blob,你可以发现他其实是在blob的两大属性上加了几个别的属性,来具体的描述整个文件

blob有啥作用呢?

1、大文件上传

得益于blob的slice方法

当要上传大文件的时候,此方法非常有用,可以将大文件分割分段,然后各自上传,因为分割之后的 Blob 对象和原始的是独立存在的。

不过目前浏览器实现此方法还没有统一,火狐使用的是 mozSlice() ,Chrome 使用的是 webkitSlice() ,其他浏览器则正常的方式 slice()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//这里提供一个兼容写法
   function sliceBlob(blob, start, end, type) {
      type = type || blob.type;
      if (blob.mozSlice) {
          return blob.mozSlice(start, end, type);
      } else if (blob.webkitSlice) {
          return blob.webkitSlice(start, end type);
      } else {
          throw new Error("This doesn't work!");
      }

生成Blob链接,用于隐藏真实链接

某个时间开始我们打开调试工具去看各大视频网站的视频src会发现,它们统统变成了这样的形式。

这其实是为了防止盗链,而让后台传入的一段二进制流,我们在给包装成blob对象,存在内存中后,在给转成可以播放的链接,这样就有效防止了真是链接的泄露,接下来我们一步步深度剖析(可能有不对之处,请大佬随之批评指正)! 1、首先第一步,我们得有一个视频网址,然后,我们通过ajax获取 2、第二部后台得给这个链接转化成一个二进制的流,我们用blob对象,给他装进去, 3、用URL.createObjectURL方法,生成一个blob url 4、给这个blob url赋值到video的src上,浏览器就会自动解析地址,播放视频

废话少说,下上代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       //创建XMLHttpRequest对象
        var xhr = new XMLHttpRequest();
        //配置请求方式、请求地址以及是否同步
        xhr.open('POST', '二进制流的地址', true);
        //设置请求结果类型为blob
        xhr.responseType = 'blob';
        //请求成功回调函数
        xhr.onload = function(e) {
            if (this.status == 200) {//请求成功
                //获取blob对象
                var blob = this.response;
                //获取blob对象地址,并把值赋给容器
                document.getElementById("video").src = URL.createObjectURL(blob);
            }
        };

上述代码有一个知识点:

URL.createObjectURL

URL.createObjectURL() 静态方法会创建一个 DOMString,其中包含一个表示参数中给出的对象的URL。这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。

也就是说使用这个方法去创建一个DOMstring 引用这这个内存中的二进制流,然后在赋值到video标签上去就能达到隐藏链接的目的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  var debug = { hello: "world" };
  var blob = new Blob([JSON.stringify(debug, null, 2)], { type: 'application/json' });
   console.log(blob)
   var url = URL.createObjectURL(blob)
   console.log(url)

如此真实的链接就会被隐藏,并且这个链接是会动态变化,他在被video解析之后指向的地址就是个二进制文件的空间地址,看不见摸不着

解析到此,回归正题

2、现在上传图片的时候提前预览到图片怎么办?

废话少说先上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//html
 <input type=file>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//js
//拿到当前的input
  const input = document.querySelector('input[type=file]')
     //监听改变,如此能拿到文件上传的特殊的blob对象,上文介绍过
        input.addEventListener('change', () => {
            //函数被执行,说明已经上传了文件
            console.log(input.files)
             //new一个fileReader对象,至于为啥先卖个关子
            const reader = new FileReader()
            reader.readAsDataURL(input.files[0]) // input.files[0]为第一个文件
            //成功之后赋值
            reader.onload = () => {
                const img = new Image()
                img.src = reader.result
                document.body.appendChild(img)  // reader.result为获取结果
            }
        }, false)

效果如下,我们发现我图片还没调用接口上传到服务器呢,就已经能预览了

下面我们来说一下卖的这个关子

FileReader是啥?

FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

下面我们开看看他的一台方法:

FileReader.readAsArrayBuffer()

开始读取指定的 Blob中的内容, 一旦完成, result 属性中保存的将是被读取文件的 ArrayBuffer 数据对象.

**FileReader.readAsBinaryString() **

开始读取指定的Blob中的内容。一旦完成,result属性中将包含所读取文件的原始二进制数据。

FileReader.readAsText()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个字符串以表示所读取的文件内容。

FileReader.readAsDataURL()

开始读取指定的Blob中的内容。一旦完成,result属性中将包含一个data: URL格式的Base64字符串以表示所读取文件的内容。这个是我们要用到的,因为他的表示方式能被img的src读取打印结果如下:

相信搞过前端的人都不陌生这些base64的字符串,其实就是一段能表示出来的二进制文件,至于为啥能解析成图片这里就不展开讲了,有兴趣自行百度,一堆答案

那有人又会问了FileReader.readAsDataURL 和URL.createObjectURL有啥区别呢?

FileReader.readAsDataURL 和URL.createObjectURL区别

1、返回值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  FileReader.readAsDataURL(blob)可以得到一段base64的字符串
  URL.createObjectURL(blob)得到的是当前文件的一个内存url

2、内存使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 FileReader.readAsDataURL(blob)得到一段超长的base64的字符串,代表的是个二进制
  URL.createObjectURL(blob)得到的是一个blob开头url地址 指向的是这个二进制地址

3、内存清理

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FileReader.readAsDataURL(blob)依照js垃圾回收机制自动从内存中清理
 URL.createObjectURL(blob)存在于当前document内,清除方式只有upload()事件或者revokeObjectURL手动清除

4、执行方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FileReader.readAsDataURL(blob)通过回调的方式f返回,异步执行;
URL.createObjectURL(blob) 直接返回,同步执行;

5、多个文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  FileReader.readAsDataURL(blob)同时处理多个文件时,需要一个文件对应一个FileReader对象;
  URL.createObjectURL(blob) 依次返回,没有影响;

更多详细区别参考:blog.csdn.net/qq_36671474…

总结

到这里啊顺利的实现一个提前预览图片的功能,核心就是利用前端的一些对象去将文件资源存存起来,不管存入内存或者字符串,然后读取即可,文章属于现学现卖,记录学习点滴,不对之处,还请大佬指正!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020年03月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
QOS队列技术有哪些?令牌桶又是什么?
1、FIFO:先进先出队列,是单队列技术,不会引入额外延迟,延迟只与队列长度有关,不提供任何差分服务。
Ponnie
2021/08/25
3K1
QOS队列技术有哪些?令牌桶又是什么?
【HCIE面试】QOS拥塞管理机制,来看看你是不是这样想的?
拥塞管理有哪些类型?默认一个接口有几个软件队列?不同优先级的报文怎么 映射进不同队列的?依据什么规则?
Ponnie
2021/04/15
2.2K2
什么是QoS?QoS是如何工作的?QoS的实验配置如何进行?
QoS(Quality of Service)是服务质量的简称。对于网络业务来说,服务质量包括哪些方面呢?
网络技术联盟站
2023/02/10
2.4K0
什么是QoS?QoS是如何工作的?QoS的实验配置如何进行?
2万字带你学习Qos原理,还有6个实验案例,建议一定要收藏!
QoS(Quality of Service)是服务质量的简称。对于网络业务来说,服务质量包括哪些方面呢?从传统意义上来讲,无非就是传输的带宽、传送的时延、数据的丢包率等,而提高服务质量无非也就是保证传输的带宽,降低传送的时延,降低数据的丢包率以及时延抖动等。广义上讲,服务质量涉及网络应用的方方面面,只要是对网络应用有利的措施,其实都是在提高服务质量。因此,从这个意义上来说,防火墙、策略路由、快速转发等也都是提高网络业务服务质量的措施之一。
网络技术联盟站
2020/09/29
4.5K1
2万字带你学习Qos原理,还有6个实验案例,建议一定要收藏!
QoS 工作原理与相关技术细节
VOIP:Voice Over Internet Protocol 模拟声音讯号数字化
利又德智能感知
2022/11/07
9181
Qos原理与配置
传统的IP网络无区别对待所有报文,网络设备处理报文采用的策略是先进先出FIFO,它依据报文到达时间的先后顺序分配转发所需要的资源。所有报文共享网络和设备的带宽等资源。
全栈程序员站长
2021/04/16
1.9K0
Qos原理与配置
H3C Qos
配置802.1p优先级到本地优先级映射表,将802.1p优先级3、4、5对应的本地优先级配置为2、6、4。保证访问服务器的优先级为研发部门(6)>管理部门(4)>市场部门(2)。
py3study
2020/01/13
1K0
通俗易懂讲一下:QOS 概念及术语
TOS、DSCP、PHB、COS、EXP(MPLS的)、ipv6TC(ipv6 Traffic Class)
网络技术联盟站
2020/01/13
3.5K0
通俗易懂讲一下:QOS 概念及术语
QOS面试总结第二篇
(1)双桶双速是有两个速度的(cir和pir),系统使用cir(承诺信息速率)朝着cbs(承诺突发尺寸)注入令牌;使用pir(峰值信息速率)朝pbs(峰值突发尺寸),当有数据经过这两个桶时,先检查pbs再检查cbs:
Ponnie
2021/03/05
1.8K0
QOS面试总结第二篇
H3C Qos概述
    QoS( Quality of Service,服务质量)用于评估服务方满足客户服务需求的能力。在 Internet 中,QoS 所评估的就是网络转发分组的服务能力。由于网络提供的服务是多样的,因此对 QoS 的评估可以基于不同方面。通常所说的 QoS,是对分组转发过程中为延迟、抖动、丢包率等核心需求提供支持的服务能力的评估。通过 Web 可以配置的 QoS 特性包括:网段带宽限速、高级带宽限速和高级带宽保证。
py3study
2020/01/15
1.1K0
H3C Qos概述
网络中的QOS技术
无论是语音还是视频,在IP网上都以IP数据包方式传输,其所需带宽完全可以由宽带多业务网络满足。但为了保证在其它数据的干扰下,或在高峰拥塞期间,在多对一的流量汇聚点上,满足关键业务的带宽、时延、抖动和丢包等要求,就需要网络提供必要的QoS(服务质量保证)技术。
网络技术联盟站
2021/05/12
2.2K0
[RoCE]网络QoS总结
 1.什么是QoS QoS是一种机制,它给一个网络流赋予一个优先级,并且管理它的最低需求(guarantees),极限能力(limitations)和它相比其他网络流的优先级服务。这是通过一个2/3阶段的过程将用户层的优先级映射到一个硬件层流量类(hardware Traffic Class)上实现的。流量类被赋予QoS属性(缓存分配,流控制,排队,调度,随机早期检测,显式拥塞通知等等),并且不同的流按照这些对应的属性被服务。 2.为什么RoCE网络需要QoS  RDMA最初设计用在运行高性能计算应用的in
昊楠Hacking
2018/03/30
3.2K0
浅谈Qos(服务访问质量)
随着网络的发展,互联网流量迅速增加,网络产生拥塞,延时增加,有时还会造成丢包,导致业务质量下降。当网络出现拥塞时,如何保证重要数据的带宽和实时性数据能够快速转发呢? QOS,服务质量。顾名思义,就是为了给现有的网络提供一个更好的性能,让各种网络应用更加顺畅的运作。当然了,如果你想让网络运作的更好,那你就得了解你自己的网络啊。看看这个网络中都运行着什么网络应用,且这些网络应用比较关心的网络因素有那些,比如网络延迟、抖动、丢包率等等因素。我们就是通过控制这些对网络应用有着关键作用的因素来调节网络的正常、高速运行的。可以这样说:QOS特性就是用来修理网络数据传输过程中的一些小瑕疵的特性。只要你把这个数据路径修理的足够光滑,在某种程度来说没有任何的阻碍了,那么数据跑起来就会相当的流畅,什么丢包啊,延迟啊,延迟抖动啊就都统统解决啦。速度和质量得到了双保障。当然了,我们得对症下药,知道问题出在了那里。并且,这样还不够,我们还要知道问题“可能”出在那里!这样的话,我们就会把这种数据传输过程中的一些不良的隐患全部消除掉了。 我们使用了QOS后,可以说是我们想让网络怎么地,网络就怎么地,完全处于你的控制中。不但实现了网络数据的流畅传输,并且对网络资源的使用也做到了精确的控制,不会浪费资源,也不会让资源出现极其紧张的局面,即使有可能出现紧张的局面,那么我们也有办法来预防这种情况的发生。废话了不少,这些都是使用QOS的好处。其实,仔细看看,也不是废话,其中也谈到了很多QOS的核心内容: 1、因为我们可以对各种网络应用做到了精确的控制使用资源,那么肯定就是对他们进行区别对待了,这也就是QOS中分类的概念啊。 2、上面说到的,修理数据传输路径上的小瑕疵,以求让数据传输的更流畅,这也就是后面我们将要降到的流量调节啊。 3、在最后面我们还提到了,出现资源紧张的局面,我们可以采取措施来搞定,这里也就说到了后面将要详细介绍的拥塞管理和拥塞避免。 QOS应用需求 1、网络拥塞 1)网络拥塞的产生 数据从高速端口进入设备,从低速端口转发出去。 流量汇聚,流量由多个端口进入设备,从一个端口转发出去,并且进入设备端口的速率之和大于转发接口的速率。 2)网络拥塞的影响 当网络出现拥塞时,可能对网络造成以下一些影响 报文传输延迟,延迟抖动和丢包率增加 由于过高的延迟和丢包导致报文重传,增加网络负担。 由于网络拥塞,报文重传导致网络的有效吞吐量降低。 3)网络拥塞的解决方法 在无法提高网络带宽的情况下,解决网络拥塞有效的方法是合理利用网络带宽,在网络发生拥塞时,根据业务的性质和需要使用QOS技术合理分配现有带宽,降低网络拥塞的影响。 QoS服务模型一共分为三种: 1、best-Effort service服务模型:它是一种单一的服务模型,也是最简单的服务模型,应用程序可以在任何时候发送任意数量的报文。网络尽最大可能发送这些报文,但是对于延时、可靠性不做保证,它是在互联网中默认的服务模型,其遵循先进先出的转发规则。 2、IntServ服务模型:IntServ服务模型在使用网络资源时,需要提前申请,申请的过程是通过RSVP(资源预留协议)完成的,应用程序会通过RSVP将需要的时延、带宽、丢包率等性能通知其他节点,这些节点收到资源预留请求后,会根据用户的合法性、资源使用情况来决定是否预留资源。 这个服务模型的扩展性很差,实施比较困难,并且RSVP存在一定缺陷,所以限制了它的广发应用。 3、Diffserv服务模型:它可以满足不同的QoS需求,与IntServ不同,它不需要预留资源,网络不需要为每个端到端的流量进行维护。Diffserv服务模型可以使用不同的方法来指定报文的QoS,如报文的优先级、MAC地址、源IP地址、目的IP地址等,网络可以通过这些信息来提供特定的服务(报文分类、流量整 形等)。 QoS的操作模型: QoS涉及四大组件:分类和标记、整 形和监管、拥塞避免和拥塞管理。QoS操作模型如下所示:
小手冰凉
2019/09/10
1.3K0
浅谈Qos(服务访问质量)
QOS-3
先进先出,没有优先级可言,who第一个进,who第一个出去。,以太网和快速以太网接口默认queue是FIFO
py3study
2020/01/09
1.1K0
QOS-3
一文带你了解QoS技术与功能
QoS(Quality of Service,服务质量)指一个网络能够利用各种基础技术,为指定的网络通信提供更好的服务能力,是网络的一种安全机制, 是用来解决网络延迟和阻塞等问题的一种技术。
网络工程师笔记
2021/05/17
1.2K0
一文带你了解QoS技术与功能
网络工程师进阶,服务质量(QOS)基本原理详解,QOS实验配置及总结
QoS(Quality of Service)是服务质量的简称。对于网络业务来说,服务质量包括哪些方面呢?
网络技术联盟站
2021/02/22
2.6K1
2200字详细讲解计算机网络的“流量管理员”:QoS 服务质量
在平时工作中,不管是软件开发者、还是运维实施者、还是网络工程师,都会遇到一个专业术语:QoS。像软件开发人员在对接MQTT的时候就会面临着QoS的设置,像网络工程师在设置流策略的时候,也会面临QoS的设置,那么这个QoS到底是个什么神器,能够受到多方IT技术人员的青睐呢?
网络技术联盟站
2023/03/05
6780
2200字详细讲解计算机网络的“流量管理员”:QoS 服务质量
比较 QoS 服务策略的 bandwidth 和 priority 命令
要想知道梨子的味道最好亲口尝一尝,网上本来有篇“比较QoS服务策略的bandwidth及priority 命令”,怎么看怎么像机器翻出来的,这里重新翻译了下
SuperDream
2019/02/28
2.6K0
流量控制--6.Classful Queuing Disciplines (qdiscs)
可以使用classful qdisc的代理来解锁Linux流量控制的灵活性和控制力。classful qdisc可以附加过滤器,允许将报文重定向到特定的类和子队列。
charlieroro
2020/12/02
1.1K0
流量控制--6.Classful Queuing Disciplines (qdiscs)
功能应用:RoCE与IB协议栈的选择策略(二)
在上一篇中,我们对RoCE、IB的协议栈层级进行了详细的对比分析,二者本质没有不同,但基于实际应用的考量,RoCE在开放性、成本方面更胜一筹。本文我们将继续分析RoCE和IB在拥塞控制、QoS、ECMP三个关键功能中的性能表现。
星融元Asterfusion
2024/11/07
4290
功能应用:RoCE与IB协议栈的选择策略(二)
相关推荐
QOS队列技术有哪些?令牌桶又是什么?
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 1、在web上怎么实现文件上传
    • 什么是blob对象
    • blob如何使用呢?
    • blob有啥作用呢?
      • 1、大文件上传
      • 生成Blob链接,用于隐藏真实链接
  • 2、现在上传图片的时候提前预览到图片怎么办?
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档