Django提交文件的方式
以上传图片为列, 提交图片文件后能在不刷新页面的前提下显示图片
首先写出一个简单的提交文件的页面:
<h>文件上传</h>
选择文件<input type="file" name="fileName" id="img">
<input type="button" value="提交" onclick="func1()">
<input type="button" value="提交" onclick="func2()"> <div id="imgs">
{% for i in path %}
<img style="width: 200px;height: 150px" src="\{{ i.filePath }}" alt="">
{% endfor %}
</div>
方法一:原生XMLHttpResponse对象+FormData
onclick func1()事件函数中加入提交方式:
function func1() {
var dic=new FormData();//创建FromData对象
dic.append("fileName",document.getElementById("img").files[0]);//对象可以存储键值对,类似于python中的字典,这里的值就是文件的内容,注意.files[0],取第一个内容
var xmlhttp = new XMLHttpRequest();//创建XMLHttpresponse对象
xmlhttp.open('post',"/mmm/upload/",true);//提交方式和提交路径
xmlhttp.send(dic);//发送数据
//先去看后台处理....
xmlhttp.onreadystatechange=function () {//回调函数
if (xmlhttp.readyState==4){//判断返回成功
var obj=JSON.parse(xmlhttp.responseText)//后台发会的是json字符串,反序列
//这里是创建一个img标签,src=后台返回的路径,就可以在页面上直接显示图片了
if (obj.state){
var img=document.createElement("img")
img.src="/"+obj.path
document.getElementById("imgs").appendChild(img)
}
}
}
}
后台:
def upload(req):
#如果是GET方式,就将数据库中的文件的路径返回到页面
if req.method=="GET":
file=models.upLoadFile.objects.all().values("filePath")
return render(req,"upload.html",{"path":file})
#post方式处理
else:
obj=req.FILES.get("fileName")#获取前段发来的数据
import os
filePath=os.path.join("static",obj.name)#拼接路
#将前段发来的数据路径和名字存储到数据库
models.upLoadFile.objects.create(**{
"fileName":obj.name,
"filePath":filePath
})
#保存文件
f = open(filePath,"wb")
for i in obj.chunks():#发过来的文件对象是一块一块的,需要chunks()循环拼接
f.write(i)
f.close()
#返回给前段的数据,包括状态和路径
ret={"state":True,"path":filePath}
import json
return HttpResponse(json.dumps(ret))#由于是XMLHttpResponse,所以这里返回的是字符串,用json序列化
方法二:Ajax+FormData:
onclick func2()事件函数中加入提交方式:
function func2() {
//创建FormData
var dic=new FormData();
dic.append("fileName",document.getElementById("img").files[0]);
//Ajax
$.ajax({
url:"/mmm/upload/",//路径
type:"POST",//提交方式
data:dic,//提交的数据,FormData就可以承载文件数据
dataType:"JSON",//返回数据类型
processData:false,//Ajax默认会设置请求头,设置数据,这里就是告诉Jquery不要去设置,数据才会简单的被获取
contentType:false,
success:function (ret) {//回调函数
if (ret.state){
var img=document.createElement("img")
img.src="/"+ret.path
$("#imgs").append(img)
}
}
})
}
后台内容和方法一相同.
方式三:form表单+iframe伪造Ajax发送请求
因为FormData在低版本的浏览器不兼容
写出form表单+iframe:
后台代码和方法一方法二相同.
<form action="/mmm/upload/" method="post" enctype="multipart/form-data" target="ifr"><!--enctype为不编码 ,target目标提交到iframe标签-->
<iframe id="ifr" name="ifr" onload="func3()"></iframe> <!--给iframe绑定一个onload事件,每次提交数据,iframe刷新完成执行-->
<input type="file" name="fafafa"> <input type="submit" value="提交">
</form>
onload函数代码:
function func3(){
var ret=$("#ifr").contents().find("body").text()//iframe会在html里面嵌入html,并且获取到的数据保存在body里面,这里想要获取到iframe得到的数据就需要加上contents(),然后find到body
ret=JSON.parse(ret)//反序列
//同方法一和方法二,创建img标签然后加入src,再添加到页面中
if (ret.state){
var img=document.createElement("img")
img.src="/"+ret.path
$("#imgs").append(img)
}
}
Django提交文件的方式的更多相关文章
- python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)
一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...
- ajax提交文件,django测试脚本环境书写,froms组件,钩子函数
1.在新版本中,添加app是直接在settings设置中,将INSTALLED_APPS里添加app名字, 但是他的完整写法是 'app01.apps.App01Config' 因为新版本做了优 ...
- python Django之文件上传
python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...
- 16.Django提交表单
Django表单提交一共有三种方式: 1.不使用Django组件进行提交 2.使用django.forms.Form(所有表单类的父类)进行提交 3.使用django.forms.ModelForm( ...
- Django Setting文件配置和简单的创建数据库字段
Django Settings文件配置 静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_D ...
- Django静态文件配置-request方法-ORM简介-字段的增删改查
app的创建注意事项: 在Django新创建的app要在seetings.py中添加注册,才会生效 创建app:django-adminapp an startapp app名称 或者 python3 ...
- day56:django:csrf_token&文件上传
目录 1.csrf介绍 2.django实现csrf_token认证 3.django实现文件上传 csrf介绍 什么是csrf? csrf:跨站请求伪造.攻击者通过HTTP请求将数据传送到服务器,从 ...
- 前端之web上传文件的方式
前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构造请求上传文件 1. web上传 ...
- 第九篇:web之前端之web上传文件的方式
前端之web上传文件的方式 前端之web上传文件的方式 本节内容 web上传文件方式介绍 form上传文件 原生js实现ajax上传文件 jquery实现ajax上传文件 form+iframe构 ...
随机推荐
- 在Scrapy中使用selenium
在scrapy中使用selenium 在scrapy中需要获取动态加载的数据的时候,可以在下载中间件中使用selenium 编码步骤: 在爬虫文件中导入webdrvier类 在爬虫文件的爬虫类的构造方 ...
- PHP 框架
LARAVEL/LUMEN, CI ,THINKPHP, YII ,SYMFONY YAF, PHALCON ,ICE FRAMEWORK
- macbook 下 spark开发环境搭建(基于idea 和maven)及spark单机写运行jar
参见链接 https://blog.csdn.net/u012373815/article/details/53266301 运行jar包: 将写好的项目打成jar,上传到服务器,进入SPARK_HO ...
- API Gateway : Kong
what problems 多个服务要写自己的log,auth,对于比较耗时的,有时还要高流量限制. solution intro 单点部署的情况: why not just haproxy log ...
- Go Example--defer
package main import ( "fmt" "os" ) func main() { f := createFile("/tmp/defe ...
- go 调用windows dll 的方法
go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...
- day 13
递归函数 一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题, ...
- 东芝 B-EV4 打印机 串口打印命令
最近在做项目时候使用了东芝的B-EV4打印机,在打印Excel时候由于字体太小,导致打印非常模糊.只能通过串口名称发送打印指令进行打印.在做项目的时候查了很多关于B-EV4打印机的资料,和打印命令.资 ...
- 血红蛋白值的临床意义(hemoglobin ,Hb,HGB)
血红蛋白临床意义: 血红蛋白增高.降低的临床意义基本和红细胞计数的临床意义相似,但血红蛋白能更好地反映贫血的程度. 血红蛋白增多有以下情况: (1)生理性增多:见于高原居民.胎儿和新生儿,剧烈活动 ...
- php中正则表达式详解
概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配.替换.截取匹配的字符串.常用的语言基本上都有正则表达式,如JavaScript.java等.其实,只有了解一种语言的正 ...