一、ajax异步文件上传

  之前有说过在form表单内的文件上传,但是会刷新页面,下面就来实现不刷新页面的异步文件上传

<div class="uploding_div">
<input class="up_input" type="file" id="file_test" onchange="change_file_name()">
<span class="put_upload" onclick="FileUpload()">上传</span>
</div>
<script>
function FileUpload(){
var formData = new FormData();//生成空的form对象
formData.append("file",$("#file_test")[0].files[0]);//把该文件对象放入formData
$.ajax({
url: "{% url 'file_upload' %}",
data: formData,
type: 'POST',
processData:false,
contentType:false,
success: function(arg){
// 当请求执行完成之后,自动调用
// arg:服务器返回的数据
alert("上传成功");
},
error: function(){
// 当请求错误之后,自动调用
}
})
}
}
</script>

后台views

def file_upload(request):
if request.method == "POST":
file_obj=request.FILES.get("file") #获取到封装了文件操作的对象
new_file_path = "upload/%s/%s"%(request.user.userprofile.id,file_obj.name)
f = open(new_file_path,"wb")
for line in file_obj.chunks(): #循环取数据
f.write(line) #写入
f.close()
return HttpResponse("ok")

二、进度条的实现

从Bootstrap找一个进度条

<!--进度条-->
<div class="progress_div">
<div class="progress hide">
<div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 0%;">
0%
</div>
</div>
</div>
<!--进度条-->
<div class="uploding_div">
<input class="up_input" type="file" id="file_test" onchange="change_file_name()">
<span class="put_upload" onclick="FileUpload()">上传</span>
</div>
<div style="width: 120px">
<span class="up_icon">未选择</span>
</div>
<script>
function change_file_name(){ $(".up_icon").text("已选择");
$(".up_icon").css("color","blue");
} //上传文件图片
function FileUpload(){
var upload_type = $(".up_input")[0].value;
if (upload_type == '') { //如果等于空
console.log("没选择文件")
}else {
var formData = new FormData();//生成空的form对象
formData.append("file",$("#file_test")[0].files[0]);//把该文件对象放入formData
$.ajax({
url: "{% url 'file_upload' %}",
data: formData,
type: 'POST',
processData:false,
contentType:false,
success: function(arg){
// 当请求执行完成之后,自动调用
// arg:服务器返回的数据 $(".up_input").val("");
$(".up_icon").text("未选择");
$(".up_icon").css("color","whitesmoke");
},
error: function(){
// 当请求错误之后,自动调用
}
});//end ajax
$(".progress").removeClass("hide");
GetFileUploadProgress($("#file_test")[0].files[0])
}
} function GetFileUploadProgress(fileobj){
var UploadProgressRefresh = setInterval(function(){
$.getJSON("{% url 'file_progress' %}",{filename:fileobj.name},function(callback){
console.log(callback); //计算进度条
var current_percent = parseInt((callback.recv_size/fileobj.size)*100)+"%";//计算百分比
$(".progress-bar").css("width",current_percent);
$(".progress-bar").text(current_percent); if (fileobj.size == callback.recv_size){//如果文件的大小等于后台传回的大小,终止定时器
clearInterval(UploadProgressRefresh); $(".progress").addClass("hide");
alert("上传成功");
//清空进度条
$(".progress-bar").css("width","0%");
$(".progress-bar").text(0); //传完后删除key
$.getJSON("{% url 'delete_cache_key' %}",{cache_key:fileobj.name},function(callback){
console.log("") })
} })
},1000);
} </script>

js代码

#上传文件
def file_upload(request):
if request.method == "POST":
file_obj=request.FILES.get("file") #获取到封装了文件操作的对象
new_file_path = "upload/%s/%s"%(request.user.userprofile.id,file_obj.name)
recv_size = 0
f = open(new_file_path,"wb")
for line in file_obj.chunks(): #循环取数据
f.write(line) #写入
recv_size += len(line)
cache.set(file_obj.name,recv_size) #以文件名为key存入缓存
f.close()
return HttpResponse("ok") #进度条获取大小
def file_progress(request):
filename = request.GET.get("filename")
progress = cache.get(filename) return HttpResponse(json.dumps({"recv_size":progress})) #传完后删除key
def delete_cache_key(requeat):
cache_key = requeat.GET.get("cache_key")
cache.delete(cache_key)
return HttpResponse("delete cache_key ceccess")

views

ajax异步文件上传和进度条的更多相关文章

  1. atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7

    atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...

  2. atitit. 文件上传带进度条 atiUP 设计 java c# php

    atitit. 文件上传带进度条 atiUP 设计 java c# php 1. 设计要求 1 2. 原理and 架构 1 3. ui 2 4. spring mvc 2 5. springMVC.x ...

  3. HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条

    页面技术:HTML5 + AJAX ( jQuery) 后台技术:Servlet 3.0 服务器:Tomcat 7.0 jQuery版本:1.9.1 Servlet 3.0 代码 package or ...

  4. springMVC+ajax 文件上传 带进度条

    前端代码: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...

  5. 一般处理程序、Ajax多图片上传带进度条

    <!DOCTYPE html><html><head>    <meta charset="utf-8" />    <tit ...

  6. HTML5文件上传还有进度条

    以下是自学it网--中级班上课笔记 网址:www.zixue.it 需要在chrome,ff,IE10下运行 html页面 <!DOCTYPE html> <html lang=&q ...

  7. jquery 实现拖动文件上传加进度条

    通过对文件的拖动实现文件的上传,主要用到的是HTML5的ondrop事件,上传内容通道FormData传输: //进度条 <div class="parent-dlg" &g ...

  8. Springboot 文件上传(带进度条)

    1. 相关依赖 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...

  9. Struts2文件上传带进度条,虽然不是很完美

    好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...

随机推荐

  1. idea_复制包名类名

  2. docker-compose 报错记录

    1.如往常一样对docker-compose.yml配置修改后,docker-compose up -d 后台启动,启动后报错,由原来的done变成了error. 第一反应就是down掉这些容器: d ...

  3. Oracle 常用目录结构(10g)

    大多数情况下,了解Oracle常用目录结构,将大大提高数据库管理与维护的工作效率,本文介绍了Oracle 10g 的常用目录. OFA: 下面给出Oracle 最优灵活体系结构OFA(Optimal ...

  4. db2 in out inout

    总结: in  给存储过程传的参数,传一个确定的值 out  传的时候传一个非确定的变量v或者“?”  .在存储过程里面计算一个结果赋给v,这个变量v在存储过程执行完之后就是一个确定的值了. inou ...

  5. 配置Struts2后运行jsp出现404的解决方法

    更新:善用控制台查看错误信息 --------------------------------------------- 原因:Java Build Path没有导入正确的jar包或者导入了但没有把相 ...

  6. Extract local angle of attack on wind turbine blades

    Extract local angle of attack on wind turbine blades Table of Contents 1. Extract local angle of att ...

  7. eclipse如何能快速找到某个文件夹或者文件

    eclipse如何能快速找到某个文件夹或者文件 直接在editor中右键 Show in -> Package Explorer 在package explore 中选中link就可以了 (魔芋 ...

  8. nyoj 19 擅长排列的小明(深搜,next_permutation)

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  9. HDU 1059 多重背包问题

    问题大意: 有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人 #include <cstdio> #include <cstring&g ...

  10. 最接近的点配对(分治问题理解) && HDU 1007代码

    题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...