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

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

  <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)
}
}

  

  

最新文章

  1. iOS 选择的照片或者拍照的图片上添加日期水印
  2. O(n)获得中位数及获得第K小(大)的数
  3. gradle android
  4. 数据结构《17》---- 自己主动补齐之《二》----Ternary Search Tree
  5. hadoop的安全模式
  6. 基于监听的事件处理——Activity本身作为事件监听器
  7. php sql uuid 32位
  8. centos crontab(定时任务) 使用
  9. Fastjson 专题
  10. Redis_MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk问题解决
  11. 第八届蓝桥杯 4、方格分割 DFS
  12. CSS魔法(五)项目实战
  13. Java 中的泛型
  14. Lodop打印条码二维码设置多宽不一定是多宽
  15. svn常见错误解决
  16. flume 1.7在windows下的安装与运行
  17. 百度开放平台连接MySQL数据库
  18. python 2.0 与 python 3.0 区别
  19. SQL Server和MySQL数据库
  20. ElasticSearch 2 (21) - 语言处理系列之单词识别

热门文章

  1. Python之os模块和sys模块
  2. php环境和使用方法
  3. 使用openresty &amp;&amp; minio &amp;&amp; thumbor 构建稳定高效的图片服务器
  4. bootstrap弹出模态框会给body加padding的解决方法
  5. 阅读 video in to axi4-stream v4.0 笔记
  6. unity的一些tips
  7. flask-appbuilder +echarts 展示数据笔记
  8. oracle表被锁(delete或update一直处于执行状态)的处理办法。
  9. win7文件夹带锁标志如何去除?win7去除文件夹带锁标志的方法
  10. 20145319 《网络渗透》MS08_067安全漏洞