ajax异步文件上传和进度条
一、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异步文件上传和进度条的更多相关文章
- atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7
atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7 1. 实现原理 1 2. 大的文件上传原理::使用applet 1 3. 新的bp 2 1. 性能提升---分割小文件上传 ...
- 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 ...
- HTML5 + AJAX ( jQuery版本 ) 文件上传带进度条
页面技术:HTML5 + AJAX ( jQuery) 后台技术:Servlet 3.0 服务器:Tomcat 7.0 jQuery版本:1.9.1 Servlet 3.0 代码 package or ...
- springMVC+ajax 文件上传 带进度条
前端代码: <form id= "uploadForm"> <p >指定文件名: <input type="text" name= ...
- 一般处理程序、Ajax多图片上传带进度条
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <tit ...
- HTML5文件上传还有进度条
以下是自学it网--中级班上课笔记 网址:www.zixue.it 需要在chrome,ff,IE10下运行 html页面 <!DOCTYPE html> <html lang=&q ...
- jquery 实现拖动文件上传加进度条
通过对文件的拖动实现文件的上传,主要用到的是HTML5的ondrop事件,上传内容通道FormData传输: //进度条 <div class="parent-dlg" &g ...
- Springboot 文件上传(带进度条)
1. 相关依赖 pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http ...
- Struts2文件上传带进度条,虽然不是很完美
好久没有写东西,最近在做个项目,要用到文件h 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...
随机推荐
- idea_复制包名类名
- docker-compose 报错记录
1.如往常一样对docker-compose.yml配置修改后,docker-compose up -d 后台启动,启动后报错,由原来的done变成了error. 第一反应就是down掉这些容器: d ...
- Oracle 常用目录结构(10g)
大多数情况下,了解Oracle常用目录结构,将大大提高数据库管理与维护的工作效率,本文介绍了Oracle 10g 的常用目录. OFA: 下面给出Oracle 最优灵活体系结构OFA(Optimal ...
- db2 in out inout
总结: in 给存储过程传的参数,传一个确定的值 out 传的时候传一个非确定的变量v或者“?” .在存储过程里面计算一个结果赋给v,这个变量v在存储过程执行完之后就是一个确定的值了. inou ...
- 配置Struts2后运行jsp出现404的解决方法
更新:善用控制台查看错误信息 --------------------------------------------- 原因:Java Build Path没有导入正确的jar包或者导入了但没有把相 ...
- 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 ...
- eclipse如何能快速找到某个文件夹或者文件
eclipse如何能快速找到某个文件夹或者文件 直接在editor中右键 Show in -> Package Explorer 在package explore 中选中link就可以了 (魔芋 ...
- nyoj 19 擅长排列的小明(深搜,next_permutation)
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...
- HDU 1059 多重背包问题
问题大意: 有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人 #include <cstdio> #include <cstring&g ...
- 最接近的点配对(分治问题理解) && HDU 1007代码
题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...