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

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

  <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. Spark:读取mysql数据作为DataFrame

    在日常工作中,有时候需要读取mysql的数据作为DataFrame数据源进行后期的Spark处理,Spark自带了一些方法供我们使用,读取mysql我们可以直接使用表的结构信息,而不需要自己再去定义每 ...

  2. C#高低位分解转换备忘

    private void Form1_Load(object sender, EventArgs e) { , , , , , ); var arr = long2LowHight(time.ToFi ...

  3. Python(一)—— 控制流:if & for & while

    基操 编程语言类 编译型 程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了.程序执行效率高,依赖编译器,跨平台性差些.缺点:编译之后 ...

  4. 强制找回gitlab管理员密码

    强制找回gitlab管理员密码 最近使用gitlab的时候发现管理员密码忘记,现将找回密码的操作过程记录下来. 1.在gitlab登录窗口 如果密码忘记了登录不进入,可以先尝试点击登录框下方的Forg ...

  5. access十万级数据分页

    最近的一个项目采用winform+access,但后来发现客户那边的数据量比较大,有数十万条数据.用sql语句进行分页,每次翻页加载都需要8秒钟左右,实在难以忍受. 后来百度了一下,发现一篇文章我的A ...

  6. OutOfMemoryError异常java内存泄漏(Memory Leak)和内存溢出(Memory Overflow)

    本篇文章理解源自于<深入理解java虚拟机>2.4章节 实战:OutOfMemoryError异常   在以下例子中,所有代码都可以抛出OutOfMemoryError异常,但是要区分到底 ...

  7. Centos7 安装redis集群哨兵模式

    https://blog.csdn.net/lihongtai/article/details/82826809

  8. gogs 源码阅读笔记 001

    gogs 源码阅读笔记 001 gogs项目相当不错,本笔记实际是基于gogs fork版本 git-122a66f. gitea (gitea版本由来)[https://blog.gitea.io/ ...

  9. redis集群相关

    1.主从数据库配置 为master数据库添加slave数据库只需要在从数据库的配置中添加配置: slaveof 主数据库地址 主数据库端口 当然,也可以通过命令: redis-server --por ...

  10. 如何让大小一定的span能够包含“容不下”的内容

    overflow: hidden; text-overflow: ellipsis; width: 70px;(长度随意) 给span加上面的代码