以上传图片为列, 提交图片文件后能在不刷新页面的前提下显示图片

首先写出一个简单的提交文件的页面:

  <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提交文件的方式的更多相关文章

  1. python 全栈开发,Day108(客户管理之权限控制,客户管理之动态"一级"菜单,其他应用使用rbac组件,django static文件的引入方式)

    一.客户管理之权限控制 昨天的作业,有很多不完善的地方 下载代码,基本实现权限验证 https://github.com/987334176/luffy_permission/archive/v1.2 ...

  2. ajax提交文件,django测试脚本环境书写,froms组件,钩子函数

    1.在新版本中,添加app是直接在settings设置中,将INSTALLED_APPS里添加app名字, 但是他的完整写法是   'app01.apps.App01Config'  因为新版本做了优 ...

  3. python Django之文件上传

    python Django之文件上传 使用Django框架进行文件上传共分为俩种方式 一.方式一 通过form表单进行文件上传 #=================================== ...

  4. 16.Django提交表单

    Django表单提交一共有三种方式: 1.不使用Django组件进行提交 2.使用django.forms.Form(所有表单类的父类)进行提交 3.使用django.forms.ModelForm( ...

  5. Django Setting文件配置和简单的创建数据库字段

    Django Settings文件配置 静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_D ...

  6. Django静态文件配置-request方法-ORM简介-字段的增删改查

    app的创建注意事项: 在Django新创建的app要在seetings.py中添加注册,才会生效 创建app:django-adminapp an startapp app名称 或者 python3 ...

  7. day56:django:csrf_token&文件上传

    目录 1.csrf介绍 2.django实现csrf_token认证 3.django实现文件上传 csrf介绍 什么是csrf? csrf:跨站请求伪造.攻击者通过HTTP请求将数据传送到服务器,从 ...

  8. 前端之web上传文件的方式

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

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

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

随机推荐

  1. 在Scrapy中使用selenium

    在scrapy中使用selenium 在scrapy中需要获取动态加载的数据的时候,可以在下载中间件中使用selenium 编码步骤: 在爬虫文件中导入webdrvier类 在爬虫文件的爬虫类的构造方 ...

  2. PHP 框架

    LARAVEL/LUMEN,  CI  ,THINKPHP, YII ,SYMFONY YAF, PHALCON ,ICE FRAMEWORK

  3. macbook 下 spark开发环境搭建(基于idea 和maven)及spark单机写运行jar

    参见链接 https://blog.csdn.net/u012373815/article/details/53266301 运行jar包: 将写好的项目打成jar,上传到服务器,进入SPARK_HO ...

  4. API Gateway : Kong

    what problems 多个服务要写自己的log,auth,对于比较耗时的,有时还要高流量限制. solution intro 单点部署的情况: why not just haproxy log ...

  5. Go Example--defer

    package main import ( "fmt" "os" ) func main() { f := createFile("/tmp/defe ...

  6. go 调用windows dll 的方法

    go 调用windows dll 的方法 ,代码如下: package main import ( "fmt" "syscall" "time&quo ...

  7. day 13

    递归函数   一.初始递归 递归函数:在一个函数里在调用这个函数本身. 递归的最大深度:998 正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去.但是我们之前已经说过关于函数调用的问题, ...

  8. 东芝 B-EV4 打印机 串口打印命令

    最近在做项目时候使用了东芝的B-EV4打印机,在打印Excel时候由于字体太小,导致打印非常模糊.只能通过串口名称发送打印指令进行打印.在做项目的时候查了很多关于B-EV4打印机的资料,和打印命令.资 ...

  9. 血红蛋白值的临床意义(hemoglobin ,Hb,HGB)

    血红蛋白临床意义:   血红蛋白增高.降低的临床意义基本和红细胞计数的临床意义相似,但血红蛋白能更好地反映贫血的程度. 血红蛋白增多有以下情况: (1)生理性增多:见于高原居民.胎儿和新生儿,剧烈活动 ...

  10. php中正则表达式详解

    概述 正则表达式是一种描述字符串结果的语法规则,是一个特定的格式化模式,可以匹配.替换.截取匹配的字符串.常用的语言基本上都有正则表达式,如JavaScript.java等.其实,只有了解一种语言的正 ...