前端之web上传文件的方式 前端之web上传文件的方式
本节内容
- web上传文件方式介绍
- form上传文件
- 原生js实现ajax上传文件
- jquery实现ajax上传文件
- 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代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.show-img{
display: inline-block;
200px;
height:200px;
}
</style>
</head>
<body>
<h1>form表单上传文件</h1><hr>
<form action="/test/" method="POST" enctype="multipart/form-data">
<p>名称:<input type="text" name="user"></p>
<p>文件:<input type="file" name="testfile"></p>
<p><input type="submit" value="提交"></p>
</form>
{% for i in imglist %}
<img class="show-img" src="/{{ i.0 }}">
{% endfor %}
</body>
</html>
在后端要注意上传过来的文件是通过req.FILES.get() 方法接收的。
后端代码:
def test(req):
if req.method=="GET":
imglist=models.Img.objects.all().values_list("img_path")
return render(req,"test.html",{"imglist":imglist})
elif req.method=="POST":
user=req.POST.get("user")
file=req.FILES.get("testfile")
path=os.path.join("static","imgs",file.name)
with open(path,"wb") as f:
for chunk in file.chunks():
f.write(chunk)
print(user,file.name,file.size)
models.Img.objects.create(img_path=path)
return redirect("/test/")
3. 原生js实现ajax上传文件
js源码:
document.getElementById("js_post").onclick=function(){
var xml=new XMLHttpRequest();
var data=new FormData; //创建formdata对象
data.append("testfile",document.getElementById("file_upload").files[0]);//找到对象之后的file[0]对应的就是文件对象
xml.open("POST","/test/",true);
xml.onreadystatechange=function(){
if(xml.readyState==4 && xml.status==200){ //判断状态到4了并且返回状态码是200时才做操作
var rsp_data=JSON.parse(xml.responseText); //反序列化
if (rsp_data.state){
var url="/"+rsp_data.data; //拼接路径
var obj=document.createElement("img"); //创建标签
obj.className="show-img"; //给标签加样式
obj.src=url; //给标签加url
document.getElementById("imgs").appendChild(obj);
}
}
};
xml.send(data)
}
`
html源码:
<hr><h1>ajax上传文件</h1><hr>
<p>文件:<input ></p>
<p><button >jquery提交</button></p>
<div >
{% for i in imglist %}
<img class="show-img" src="/{{ i.0 }}">
{% endfor %}
</div>
后端源码:
def test(req):
if req.method=="GET":
imglist=models.Img.objects.all().values_list("img_path")
return render(req,"test.html",{"imglist":imglist})
elif req.method=="POST":
user=req.POST.get("user",None)
file=req.FILES.get("testfile")
path=os.path.join("static","imgs",file.name)
with open(path,"wb") as f:
for chunk in file.chunks():
f.write(chunk)
print(user,file.name,file.size)
models.Img.objects.create(img_path=path)
# return redirect("/test/")
msg={"code":200,"state":True,"data":path}
return HttpResponse(json.dumps(msg))
注意:FormData对象在添加文件对象的时候并不是把标签直接给append进去,而是找到标签之后.file(0)才是文件对象
4. jquery实现ajax上传文件
这里的html代码和后端代码相对上面没有改变,这里就不列出来了。
jquery代码:
$("#jquery_post").on("click",function(){
var data=new FormData;
data.append("testfile",document.getElementById("file_upload").files[0]);
$.ajax({
url:"/test/",
type:"POST",
dataType:"JSON",
data:data,
contentType: false,
processData: false,
success:function(rst){
if(rst.state){
var url="/"+rst.data;
$('<img class="show-img" src="'+url+'">').appendTo("#imgs")
}
}
})
})
注意:jquery的ajax会自动把我们的数据转换成字符串,不想转换时需要在ajax里面写入:contentType: false,processData: false,
5. form+iframe构造请求上传文件
html代码:
<hr><h1>form+iframe上传文件</h1><hr>
<p><iframe ></iframe></p> <!--注意这里的name要和form中的target一致-->
<form target="uploadfile" action="/test/" method="POST" enctype="multipart/form-data">
<p>名称:<input type="text" name="user"></p>
<p>文件:<input type="file" name="testfile"></p>
<p><input type="submit" value="提交"></p>
</form>
<div >
{% for i in imglist %}
<img class="show-img" src="/{{ i.0 }}">
{% endfor %}
</div>
注意:这里的iframe的name的值一定要和form的target的值一样,这样才能实现绑定
js代码:
$("#uploadfile").on("load",function(){ //iframe里面有个方法是onload,当上传数据成功之后服务器返回数据时才会触发该事件
var rst=JSON.parse(this.contentDocument.body.textContent);//拿到iframe里面的内容需要通过contentDocument才能拿到里面的dom对象
if (rst.state){
var url="/"+rst.data;
$('<img class="show-img" src="'+url+'">').appendTo("#imgs")
}
})
注意:拿到iframe里面的内容需要通过contentDocument才能拿到里面的dom对象
经过实际检测,当鼠标点击提交速度比较快时,js通过ajax提交数据没有问题,但是iframe就无法提交所有数据。。。
原因是ajax是异步加载的,而iframe更像是通过浏览器打开了一个新标签,等待服务端传输回来的数据。所以,当提交速度过快时无法达到相应的效果。
使用iframe的唯一一个好处目前来看也就是兼容老版本的浏览器罢了。。。
随着时间的流逝,这种方式终将被淘汰。
相关推荐
- 前端之web上传文件的方式 前端之web上传文件的方式
- Web安全之SQL注入攻击技巧与防范 在Web1.0时代,人们更多是关注服务器端动态脚本语言的安全问题,比如将一个可执行脚本(俗称Webshell)通过脚本语言的漏洞上传到服务器上,从而获得服务器权限。在Web发展初期,随着动态脚本语言的发展和普及,以及早期工程师对安全问题认知不足导致很多”安全血案”的发生,至今仍然遗留下许多历史问题,比如PHP语言至今仍然无法从语言本身杜绝「文件包含漏洞」(参见这里),只能依靠工程师良好的代码规范和安全意识。 常见攻击方式 SQL注入常见攻击技巧 如何确定SQL注入漏洞 如何防御SQL注入 数据库信息加密安全 小结
- 微信小程序上传文件(报错处理方式) 1.未显示页面,因为请求实体过大 2. Web请求报出"超过了最大请求长度[注意:重启IIS]" 3. 最终WebConfig的配置如下
- Spring MVC技术之【上机】 1.【上机】配置mvc环境 2.【上机】使用注解的方式实现Spring MVC的参数的传递(页面上传入和传出) 3.【上机】实现Spring MVC注册实现和过程中的一些问题 4.【上机】实现Spring MVC和AJAX的交互,包括接收json请求参数 5.【上机】使用Spring MVC实现文件上传 6.【上机】Spring MVC使用二种方式实现自定义拦截器 7.【上机】使用自定义拦截器实现用户登录验证 8.【上机】集成Spring与Spring MVC 9.【上机】集成Spring与Spring MVC加JDBC,实现对用户的CRUD操作
- Web前端攻击方式及防御措施 一、XSS 二、 CSRF 三、SQL注入 四、cookie窃取和session劫持 五、钓鱼攻击【重定向攻击】 六、Http Heads攻击 七、拒绝服务攻击【DoS】 八、文件上传攻击
- 黑客秘籍:7个有趣的信息安全项目 1.逆向分析简单Linux程序 2.Python实现Zip文件的暴力破解 3.文件上传漏洞实例分析 4.Python 实现 FTP 弱口令扫描器 5.BMP图像信息隐藏 6.Python暴力猜解Web登录 7.Sql注入之sqlmap+dvwa实例演练 最后
- 前端开发06 我们会对页面进行测试,测试内容主要包括哪几个方面? xml的解析方式? 常用的用dom解析和sax解析。dom解析是一次性读取xml文件并将其构造为DOM对象供程序使用,优点是操作方便,但是比较耗内存。Sax是按事件驱动的方式解析的,占用内存少,但是编程复杂 介绍一下javascript中function的用法 在网页设计与制作时,为了使制作出来的网页下载速度快、布局合理、浏览方便、和谐悦目,应注意哪些问题? 网页文件大小页面布局页面导航图像大小颜色搭配背景图像 CSS+DIV开发Web页面的优势有哪些? 介绍一下JavaScript中的对象
- jenkins 部署前端项目 linux 服务器上选安装 node: jenkins 上安装nodejs 插件: 另一种安装方式,直接下载 nodejs.hpi 文件,点击高级,上传文件安装 配置nodejs 部署服务器和jenkins不是同一台服务器,需要添加如下配置: 添加一个构件: 添加可根据 “tag标签” 发布的构件(常常用于生产环境构建): 如何触发 下载git上的代码,会放在当前工作空间上,查看构建成功后的dist代码方法如下: CentOS 系统安装 yarn
- HTML、CSS --chrome书签整理 CSS三栏布局——中间固定两边自适应宽度 负值之美:负值在页面布局中的应用 为什么图片资源放在cdn上面不会出现跨域访问呢?cdn的ip和你网站的ip不是不同的吗? CSS浮动属性Float详解 由浅入深漫谈margin属性 前端开发 IE 中的常用调试工具 提高Web页面的性能(一) 分类“网站优化”所有日志 图片垂直居中的使用技巧 如何快速定位页面中复杂 CSS BUG 问题 1个月成为HTML5前端工程师 Chrome渲染Transition时页面闪动Bug 整理:子容器垂直居中于父容器的方案 Web 前端开发精华文章推荐(jQuery、HTML5、CSS3)【系列十二】 你需要了解的z-index世界 CSS margin属性与用法教程 高大上的 CSS 效果:Shape Blobbing HTML5 本地裁剪图片并上传至服务器(老梗) HTML5+CSS3+JQUERY 牛刀小试 仿3D圆柱图
- linux 下文件上传的两种工具(XFTP5和Putty之pscp)方式
- 区块链学习7:超级账本项目Hyperledger与Fabric以及二者的关系
- PHPStorm配置自己喜欢的主题