iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >web开发中文件上传的实现方式有哪些
  • 713
分享到

web开发中文件上传的实现方式有哪些

2024-04-02 19:04:59 713人浏览 独家记忆
摘要

小编给大家分享一下web开发中文件上传的实现方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   文件上传是WEB开发

小编给大家分享一下web开发中文件上传的实现方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

  文件上传是WEB开发常见需求,上传文件需要用到文件输入框,如果给文件输入框添加一个multiple属性则可以一次选择多个文件(不支持的浏览器会自动忽略这个属性)

  <inputmultipletype="file">

  点击这个输入框就可以打开浏览文件对话框选择文件了,一般一个输入框上传一个文件就行,要上传多个文件也可以用多个输入框来处理,这样做是为了兼容那些不支持multiple属性的浏览器,同时用户一般也不会选择多个文件

  (推荐学习html视频教程

  基本上传方式

  当把文件输入框放入表单中,提交表单的时候即可将选中的文件一起提交上传到服务器,需要注意的是由于提交的表单中包含文件,因此要修改一下表单元素的enctype属性为multipart/fORM-data

  <forMaction="#"enctype="multipart/form-data"method="post">

  <inputname="file"type="file">

  <buttontype="submit">Upload</button>

  </form>

  这样上传方式是传统的同步上传,上传的文件如果很大,往往需要等待很久,上传完成后页面还会重新加载,并且必须等待上传完成后才能继续操作

  早期的浏览器并不支持异步上传,不过可以使用iframe来模拟,在页面中隐藏一个<iframe>元素,指定一个name值,同时将<form>元素的target属性值指定为<iframe>元素的name属性的值,将两者关联起来

  <formaction="#"enctype="multipart/form-data"method="post"target="upload-frame">

  <inputname="file"type="file">

  <buttontype="submit">Upload</button>

  </form>

  <iframeid="upload-frame"name="upload-frame"src="about:blank"style="display:none;"></iframe>

  这样在提交表单上传的时候,页面就不会重新加载了,取而代之的是iframe重新加载了,不过iframe原本就是隐藏的,即使重新加载也不会感知到

  访问文件

  Fileapi提供了访问文件的能力,通过输入框的files属性访问,这会得到一个FileList,这是一个集合,如果只选择了一个文件,那么集合中的第一个元素就是这个文件

  varinput=document.querySelector('input[type="file"]')

  varfile=input.files[0]

  console.log(file.name)//文件名称

  console.log(file.size)//文件大小

  console.log(file.type)//文件类型

  支持FileAPI的浏览器可以参考caniuse

  ajax上传

  由于可以通过FileAPI直接访问文件内容,再结合XMLHttpRequest对象直接将文件上传,将其作为参数传给XMLHttpRequest对象的send方法即可

  varxhr=newXMLHttpRequest()

  xhr.open('POST','/upload/url',true)

  xhr.send(file)

  不过一些原因不建议直接这样传递文件,而是使用FormData对象来包装需要上传的文件,FormData是一个构造函数,使用的时候先new一个实例,然后通过实例的append方法向其中添加数据,直接把需要上传的文件添加进去

  varformData=newFormData()

  formData.append('file',file,file.name)//第3个参数是文件名称

  formData.append('username','Mary')//还可以添加额外的参数

  甚至也可以直接把表单元素作为实例化参数,这样整个表单中的数据就全部包含进去了

  varformData=newFormData(document.querySelector('form'))

  数据准备好后,就是上传了,同样是作为参数传给XMLHttpRequest对象的send方法

  varxhr=newXMLHttpRequest()

  xhr.open('POST','/upload/url',true)

  xhr.send(formData)

  监测上传进度

  XMLHttpRequest对象还提供了一个progress事件,基于这个事件可以知道上传进度如何

  varxhr=newXMLHttpRequest()

  xhr.open('POST','/upload/url',true)

  xhr.upload.onprogress=progresshandler//这个函数接下来定义

  上传的progress事件由xhr.upload对象触发,在事件处理程序中使用这个事件对象的loaded(已上传字节数)和total(总数)属性来计算上传的进度

  functionprogressHandler(e){

  varpercent=Math.round((e.loaded/e.total)*100)

  }

  上面的计算会得到一个表示完成百分比的数字,不过这两个值也不一定总会有,保险一点先判断一下事件对象的lengthComputable属性

  functionprogressHandler(e){

  if(e.lengthComputable){

  varpercent=Math.round((e.loaded/e.total)*100)

  }

  }

  支持Ajax上传的浏览器可以参考caniusehttps://caniuse.com/#feat=xhr2

  分割上传

  使用文件对象的slice方法可以分割文件,给该方法传递两个参数,一个起始位置和一个结束位置,这会返回一个新的Blob对象,包含原文件从起始位置到结束位置的那一部分(文件File对象其实也是Blob对象,这可以通过fileinstanceofBlob确定,Blob是File的父类)

  varblob=file.slice(0,1024)//文件从字节位置0到字节位置1024那1KB

  将文件分割成几个Blob对象分别上传就能实现将大文件分割上传

  functionupload(file){

  letformData=newFormData()

  formData.append('file',file)

  letxhr=newXMLHttpRequest()

  xhr.open('POST','/upload/url',true)

  xhr.send(formData)

  }

  varblob=file.slice(0,1024)

  upload(blob)//上传第一部分

  varblob2=file.slice(1024,2048)

  upload(blob2)//上传第二部分

  //上传剩余部分

  通常用一个循环来处理更方便

  varpos=0//起始位置

  varsize=1024//块的大小

  while(pos<file.size){

  letblob=file.slice(pos,pos+size)//结束位置=起始位置+块大小

  upload(blob)

  pos+=size//下次从结束位置开始继续分割

  }

  服务器接收到分块文件进行重新组装的代码就不在这里展示了

  使用这种方式上传文件会一次性发送多个HTTP请求,那么如何处理这种多个请求同时发送的情况呢?方法有很多,可以用Promise来处理,让每次上传都返回一个promise对象,然后用Promise.all方法来合并处理,Promise.all方法接受一个数组作为参数,因此将每次上传返回的promise对象放在一个数组中

  varpromises=[]

  while(pos<file.size){

  letblob=file.slice(pos,pos+size)

  promises.push(upload(blob))//upload应该返回一个promise

  pos+=size

  }

  同时改造一下upload函数使其返回一个promise

  functionupload(file){

  returnnewPromise((resolve,reject)=>{

  letformData=newFormData()

  formData.append('file',file)

  letxhr=newXMLHttpRequest()

  xhr.open('POST','/upload/url',true)

  xhr.onload=()=>resolve(xhr.responseText)

  xhr.onerror=()=>reject(xhr.statusText)

  xhr.send(formData)

  })

  }

  当一切完成后

  Promise.all(promises).then((response)=>{

  console.log('Uploadsuccess!')

  }).catch((err)=>{

  console.log(err)

  })

  支持文件分割的浏览器可以参考caniuse

  判断一下文件对象是否有该方法就能知道浏览器是否支持该方法,对于早期的部分版本浏览器需要加上对应的浏览器厂商前缀

  varslice=file.slice||file.webkitSlice||file.mozSlice

  if(slice){

  letblob=slice.call(file,0,1024)//call

  upload(blob)

  }else{

  upload(file)//不支持分割就只能直接上传整个文件了,或者提示文件过大

  }

  拖拽上传

  通过拖拽API可以实现拖拽文件上传,默认情况下,拖拽一个文件到浏览器中,浏览器会尝试打开这个文件,要使用拖拽功能需要阻止这个默认行为

  document.addEventListener('draGover',function(e){

  e.preventDefault()

  e.stopPropagation()

  })

  任意指定一个元素来作为释放拖拽的区域,给一个元素绑定drop事件

  varelement=document.querySelector('label')

  element.addEventListener('drop',function(e){

  e.preventDefault()

  e.stopPropagation()

  //...

  })

  通过该事件对象的dataTransfer属性获取文件,然后上传即可

  varfile=e.dataTransfer.files[0]

  upload(file)//upload函数前面已经定义

  选择类型

  给文件输入框添加accept属性即可指定选择文件的类型,比如要选择png格式的图片,则指定其值为image/png,如果要允许选择所有类型的图片,就是image/*

  <inputaccept="image/*"type="file">

  添加capture属性可以调用设备机能,比如capture="camera"可以调用相机拍照,不过这并不是一个标准属性,不同设备实现方式也不一样,需要注意

  <inputaccept="image/*"capture="camera"type="file">

  经测iOS设备添加该属性后只能拍照而不能从相册选择文件了,所以判断一下

  if(iOS){//iOS用navigator.userAgent判断

  input.removeAttribute('capture')

  }

  不支持的浏览器会自动忽略这些属性

  自定义样式

  文件输入框在各个浏览器中呈现的样子都不大相同,而且给input定义样式也不是那么方便,如果有需要应用自定义样式,有一个技巧,可以用一个label关联到这个文件输入框,当点击这个label元素的时候就会触发文件输入框的点击,打开浏览文件的对话框,相当于点击了文件输入框一样的效果

  <labelfor="file-input"></label>

  <inputid="file-input"style="clip:rect(0,0,0,0);position:absolute;"type="file">

  这时就可以将原本的文件输入框隐藏了,然后给label元素任意地应用样式,毕竟要给label元素应用样式比input方便得多

以上是“web开发中文件上传的实现方式有哪些”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: web开发中文件上传的实现方式有哪些

本文链接: https://www.lsjlt.com/news/91478.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • web开发中文件上传的实现方式有哪些
    小编给大家分享一下web开发中文件上传的实现方式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   文件上传是Web开发...
    99+
    2024-04-02
  • Java中文件上传的方式有哪些
    本文小编为大家详细介绍“Java中文件上传的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java中文件上传的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。请求类型单文件上传 &n...
    99+
    2023-07-02
  • 用于web开发的文件上传怎么实现
    这篇“用于web开发的文件上传怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“用于w...
    99+
    2024-04-02
  • Java实现文件上传的方法有哪些
    这篇文章给大家分享的是有关Java实现文件上传的方法有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一. uploadify:uploadify控件的scripts和styles在这里:图片上传JSP:<...
    99+
    2023-05-30
    java
  • windows到linux上传文件的方式有哪些
    这篇文章主要介绍windows到linux上传文件的方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!lrzsz方式上传文件首先安装lrzsz包[root@localhost ~]# yum...
    99+
    2023-06-27
  • web开发中有哪些响应式文字
    这篇文章主要介绍了web开发中有哪些响应式文字,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。简单来说,响应式是为了让网页在各种显示设备上都有...
    99+
    2024-04-02
  • asp文件上传的方法有哪些
    1. 使用HTML表单上传文件:可以通过HTML表单中的元素实现文件上传,用户选择文件后,文件会被上传到服务器。2. 使用ASP自带...
    99+
    2023-06-13
    asp文件上传
  • linux传输文件的方式有哪些
    这篇文章主要介绍了linux传输文件的方式有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux传输文件的方式有哪些文章都会有所收获,下面我们一起来看看吧。1. scp...
    99+
    2024-04-02
  • 【web安全】——文件上传的绕过方式
    作者名:白昼安全 主页面链接: 主页传送门 创作初心: 一切为了她 座右铭: 不要让时代的悲哀成为你的悲哀 专研方向: web安全,后渗透技术 每日emo: ...
    99+
    2023-08-31
    web安全 javascript 前端 Powered by 金山文档
  • java文件传输方式有哪些
    Java文件传输方式有以下几种:1. 使用Java socket编程:可以通过建立服务器和客户端之间的Socket连接来传输文件。服...
    99+
    2023-08-31
    java
  • Ajax中有哪些文件上传控件
    这篇文章给大家分享的是有关Ajax中有哪些文件上传控件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1. FancyUpload FancyUpload是一个采用Fla...
    99+
    2024-04-02
  • python中有哪些打开文件的方式
    今天就跟大家聊聊有关python中有哪些打开文件的方式,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、函数说明open 函数默认以只读方式打开文件,并且返回文件对象2、语法f&nb...
    99+
    2023-06-15
  • 有哪些Web前端开发找错的方式
    这篇文章主要讲解了“有哪些Web前端开发找错的方式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“有哪些Web前端开发找错的方式”吧!WEB开发主要是两个交互(B/S数据)浏览器:1包含htm...
    99+
    2023-06-08
  • Java Web开发中文乱码有哪些
    这篇文章主要讲解了“Java Web开发中文乱码有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Web开发中文乱码有哪些”吧!一、有必要了解一些基本的编码知识jsp的三次编码*...
    99+
    2023-06-17
  • jQuery中如何实现Ajax方式上传文件
    这篇文章主要介绍jQuery中如何实现Ajax方式上传文件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!jQuery Ajax方式上传文件用到两个对象第一个对象:FormData第二...
    99+
    2024-04-02
  • Web开发中文件名要小写的原因有哪些
    本篇内容介绍了“Web开发中文件名要小写的原因有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、可移植性Linux 系统是大小写敏感的...
    99+
    2023-06-27
  • web中图像文件格式有哪些
    这篇文章主要介绍web中图像文件格式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、哪三种格式? 分别为:gif、jpg、png。 二、优化图像文件为何重要? 对于访问量不高的网站而言,图像的优化也许并不会引...
    99+
    2023-06-08
  • web开发中可以实现前端动画的方法有哪些
    这篇文章主要介绍web开发中可以实现前端动画的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!   1、javascript直接实现   主要思想是通过setInterv...
    99+
    2024-04-02
  • Spring Boot实现文件上传的两种方式
    最近的一个小项目里使用到了文件上传、下载功能,今天我打算梳理一下文件上传所涉及的技术及实现。 内容主要包括两部分,如何通过纯 Servlet 的形式进行文件上传、保存(不通过 Spring 框架);另一部分是如何在 Spring Web M...
    99+
    2023-09-02
    spring boot servlet java
  • java实现文件下载的方式有哪些
    在Java中,可以使用以下方式实现文件下载: 使用URL和URLConnection类:可以通过创建URL对象,然后打开连接并获取...
    99+
    2024-04-08
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作