前端之web上传文件的方式

本节内容

  1. web上传文件方式介绍
  2. form上传文件
  3. 原生js实现ajax上传文件
  4. jquery实现ajax上传文件
  5. form+iframe构造请求上传文件

1. web上传文件方式介绍

在web浏览器上传文件一般有以下几种方式:

  • form表单上传文件
  • 原生js实现ajax上传文件
  • jquery实现ajax上传文件
  • form+iframe上传文件

其中form提交数据之后会整个刷新页面;
js通过ajax上传文件虽然不会刷新整个页面,但是他们都是通过使用formdata对象实现的,formdata对象在老版本的浏览器中并不支持;
为了兼容老版本浏览器,使用iframe方式提交;

下面几节就分别就这几种方式实现上传文件来举例说明。

2. form上传文件

这是最原始的一种方式,最开始学习web的时候就是使用这种方式提交。
注意:在form表单中如果要上传文件,一定要设置这个参数: enctype=”multipart/form-data”表示封装数据类型,把数据分成一个一个小段传输。

html代码:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <style>
  7. .show-img{
  8. display: inline-block;
  9. width: 200px;
  10. height:200px;
  11. }
  12. </style>
  13. </head>
  14. <body>
  15. <h1>form表单上传文件</h1><hr>
  16. <form action="/test/" method="POST" enctype="multipart/form-data">
  17. <p>名称:<input type="text" name="user"></p>
  18. <p>文件:<input type="file" name="testfile"></p>
  19. <p><input type="submit" value="提交"></p>
  20. </form>
  21. {% for i in imglist %}
  22. <img class="show-img" src="/{{ i.0 }}">
  23. {% endfor %}
  24. </body>
  25. </html>

在后端要注意上传过来的文件是通过req.FILES.get() 方法接收的。
后端代码:

  1. def test(req):
  2. if req.method=="GET":
  3. imglist=models.Img.objects.all().values_list("img_path")
  4. return render(req,"test.html",{"imglist":imglist})
  5. elif req.method=="POST":
  6. user=req.POST.get("user")
  7. file=req.FILES.get("testfile")
  8. path=os.path.join("static","imgs",file.name)
  9. with open(path,"wb") as f:
  10. for chunk in file.chunks():
  11. f.write(chunk)
  12. print(user,file.name,file.size)
  13. models.Img.objects.create(img_path=path)
  14. return redirect("/test/")

3. 原生js实现ajax上传文件

js源码:

  1. document.getElementById("js_post").onclick=function(){
  2. var xml=new XMLHttpRequest();
  3. var data=new FormData; //创建formdata对象
  4. data.append("testfile",document.getElementById("file_upload").files[0]);//找到对象之后的file[0]对应的就是文件对象
  5. xml.open("POST","/test/",true);
  6. xml.onreadystatechange=function(){
  7. if(xml.readyState==4 && xml.status==200){ //判断状态到4了并且返回状态码是200时才做操作
  8. var rsp_data=JSON.parse(xml.responseText); //反序列化
  9. if (rsp_data.state){
  10. var url="/"+rsp_data.data; //拼接路径
  11. var obj=document.createElement("img"); //创建标签
  12. obj.className="show-img"; //给标签加样式
  13. obj.src=url; //给标签加url
  14. document.getElementById("imgs").appendChild(obj);
  15. }
  16. }
  17. };
  18. xml.send(data)
  19. }
  20. `

html源码:

  1. <hr><h1>ajax上传文件</h1><hr>
  2. <p>文件:<input id="file_upload" type="file" name="testfile"></p>
  3. <p><button id="js_post">原生js提交</button> <button id="jquery_post">jquery提交</button></p>
  4. <div id="imgs">
  5. {% for i in imglist %}
  6. <img class="show-img" src="/{{ i.0 }}">
  7. {% endfor %}
  8. </div>

后端源码:

  1. def test(req):
  2. if req.method=="GET":
  3. imglist=models.Img.objects.all().values_list("img_path")
  4. return render(req,"test.html",{"imglist":imglist})
  5. elif req.method=="POST":
  6. user=req.POST.get("user",None)
  7. file=req.FILES.get("testfile")
  8. path=os.path.join("static","imgs",file.name)
  9. with open(path,"wb") as f:
  10. for chunk in file.chunks():
  11. f.write(chunk)
  12. print(user,file.name,file.size)
  13. models.Img.objects.create(img_path=path)
  14. # return redirect("/test/")
  15. msg={"code":200,"state":True,"data":path}
  16. return HttpResponse(json.dumps(msg))

注意:FormData对象在添加文件对象的时候并不是把标签直接给append进去,而是找到标签之后.file(0)才是文件对象

4. jquery实现ajax上传文件

这里的html代码和后端代码相对上面没有改变,这里就不列出来了。
jquery代码:

  1. $("#jquery_post").on("click",function(){
  2. var data=new FormData;
  3. data.append("testfile",document.getElementById("file_upload").files[0]);
  4. $.ajax({
  5. url:"/test/",
  6. type:"POST",
  7. dataType:"JSON",
  8. data:data,
  9. contentType: false,
  10. processData: false,
  11. success:function(rst){
  12. if(rst.state){
  13. var url="/"+rst.data;
  14. $('<img class="show-img" src="'+url+'">').appendTo("#imgs")
  15. }
  16. }
  17. })
  18. })

注意:jquery的ajax会自动把我们的数据转换成字符串,不想转换时需要在ajax里面写入:contentType: false,processData: false,

5. form+iframe构造请求上传文件

html代码:

  1. <hr><h1>form+iframe上传文件</h1><hr>
  2. <p><iframe id="uploadfile" name="uploadfile" style="display: none"></iframe></p> <!--注意这里的name要和form中的target一致-->
  3. <form target="uploadfile" action="/test/" method="POST" enctype="multipart/form-data">
  4. <p>名称:<input type="text" name="user"></p>
  5. <p>文件:<input type="file" name="testfile"></p>
  6. <p><input type="submit" value="提交"></p>
  7. </form>
  8. <div id="imgs">
  9. {% for i in imglist %}
  10. <img class="show-img" src="/{{ i.0 }}">
  11. {% endfor %}
  12. </div>

注意:这里的iframe的name的值一定要和form的target的值一样,这样才能实现绑定

js代码:

  1. $("#uploadfile").on("load",function(){ //iframe里面有个方法是onload,当上传数据成功之后服务器返回数据时才会触发该事件
  2. var rst=JSON.parse(this.contentDocument.body.textContent);//拿到iframe里面的内容需要通过contentDocument才能拿到里面的dom对象
  3. if (rst.state){
  4. var url="/"+rst.data;
  5. $('<img class="show-img" src="'+url+'">').appendTo("#imgs")
  6. }
  7. })

注意:拿到iframe里面的内容需要通过contentDocument才能拿到里面的dom对象
经过实际检测,当鼠标点击提交速度比较快时,js通过ajax提交数据没有问题,但是iframe就无法提交所有数据。。。
原因是ajax是异步加载的,而iframe更像是通过浏览器打开了一个新标签,等待服务端传输回来的数据。所以,当提交速度过快时无法达到相应的效果。
使用iframe的唯一一个好处目前来看也就是兼容老版本的浏览器罢了。。。
随着时间的流逝,这种方式终将被淘汰。

前端之web上传文件的方式的更多相关文章

  1. 第九篇:web之前端之web上传文件的方式

    前端之web上传文件的方式   前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构 ...

  2. 基于Flask开发网站 -- 前端Ajax异步上传文件到后台

    大家好,我是辰哥~ 辰哥最近利用空闲时间在写一个在线可视化平台,过程中也觉得一些技术还是比较有意思的,所以就以模块化的形式分享出来.如:从网页界面(前端)上传文件到服务器(后端). 放一下该模块的界面 ...

  3. Web上传文件的原理及实现

    现在有很多Web程序都有上传功能,实现上传功能的组件或框架也很多,如基于java的Commons FileUpload.还有Struts1.x和Struts2中带的上传文件功能(实际上,Struts2 ...

  4. Java+web+上传文件夹

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/1269085759/up6-jsp-mysq ...

  5. Web上传文件

      客户端      相对于FTP文件上传,Web文件上传速度慢一些,但使用方便,不需要客户端,而且权限比FTP容易控制. Web文件上传采用POST方式,上传文件需要设置FORM的entype属性为 ...

  6. Asp.Net Mvc异步上传文件的方式

    今天试了下mvc自带的ajax,发现上传文件时后端action接收不到文件, Request.Files和HttpPostedFileBase都接收不到.....后来搜索了下才知道mvc自带的Ajax ...

  7. Jquery_异步上传文件多种方式归纳

    1.不用任何插件,利用iframe,将form的taget设为iframe的name,注意设为iframe的id是没用的,跟网上很多说的不太一致 iframe_upload.htm <!DOCT ...

  8. Web上传文件的三种解决方案

    第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname =  ...

  9. 使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_130 之前一篇文章是通过普通js+tornado来上传七牛云:使用Tornado配合七牛云存储api来异步切分上传文件,本次使用v ...

随机推荐

  1. jQuery -原生 如何互转

    今天研究源码的时候发现,不需要用get() 也能进行原生转换,使用原生方法. 原生- jQuery对象   var obj=document.xxx $(obj).css(); 也可以直接 $(doc ...

  2. SharePoint 2013 configure and publish infopth

    This article will simply descript how to configure and publish a InfoPath step by step. Note: To con ...

  3. android官方下拉刷新控件SwipeRefreshLayout的使用

    可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿出来分享. 简介:SwipeRefreshLayout组件只 ...

  4. [Tool] Open Live Writer插件开发

    一 前言 Windows Live Writer(简称 WLW)开源之后变成 Open Live Writer(简称 OLW),原先 WLW 的插件在 OLW 下都不能用了,原因很简单,WLW 插件开 ...

  5. input输入

    只能输入数字onkeyup='this.value=this.value.replace(/\D/gi,"")'限制文本框只能输入正数,小数onkeyup="value= ...

  6. java单例模式的实现方式

    一.什么是单例模式 单例:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的软件设计模式之一,其目的是保证整个应用中只存在类的唯一个实例. 比如我们在系统启动时,需要加载一些 ...

  7. 关于Java泛型的使用

    在目前我遇到的java项目中,泛型应用的最多的就属集合了.当要从数据库取出多个对象或者说是多条记录时,往往都要使用集合,那么为什么这么使用,或者使用时有什么要注意的地方,请关注以下内容. 感谢Wind ...

  8. IE 浏览器各个版本 JavaScript 支持情况一览表

    语言元素 语言元素 突发.IE6 标准.IE7 标准 IE8 标准 IE 9 标准 IE 10 标准 边缘 Windows 应用商店应用程序 __proto__ 属性 (Object) (JavaSc ...

  9. awk应用

    h3 { color: rgb(255, 255, 255); background-color: rgb(30,144,255); padding: 3px; margin: 10px 0px } ...

  10. ArcGIS Engine开发之属性查询

    属性查询即基于空间数据的属性数据的查询,通过用户提交SQL语言中的where语句定义的查询条件,对属性数据进行搜索,从而得到查询结果的操作. 相关的类与接口 与属性查询功能相关的类主要有QureyFi ...