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 传的,以前虽然也做上传,但是总觉得不好用 ,现在和队友合作做了一个带进度条的上传,觉得还行~~和大家分享一下. 首先说一下大概是这样实现的,在我们平时的上 ...
随机推荐
- CAD在网页中如何实现嵌套打印?
当用户需要打印两个控件的图纸时,可以采用嵌套打印实现.点击此处在线演示. 实现嵌套打印功能,首先将两个控件放入网页中,js代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ...
- 面向对象程序设计--Java语言第二周编程题:有秒计时的数字时钟
有秒计时的数字时钟 题目内容: 这一周的编程题是需要你在课程所给的时钟程序的基础上修改而成.但是我们并不直接给你时钟程序的代码,请根据视频自己输入时钟程序的Display和Clock类的代码,然后来做 ...
- eclipse 中为 java 项目生成 API 文档、JavaDoc
当我们的项目很大,编写了很多代码的时候,就需要生成一个标准的 API 文档,让后续的开发人员,或者合作者可以清晰的了解您方法的使用. 1.点击 eclipse 的 Project 菜单,选择 Gene ...
- Network----轮询
轮询: 定时每隔多长时间刷新一次,但是,7X24的对服务器的压力会过大,因为在夜间或者是流量低峰期时,他还要持续工作. 客户端发一次请求,服务器就要相应一次. 长轮询: 和轮询的模式不同,长轮询是一次 ...
- Python基础(九) 内置模块
今天学习Python中的模块,模块类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能需要多个函数才能完成(函 ...
- hdu 2255KM算法模板
#include<stdio.h> #include<string.h> #define N 400 #define inf 0x7fffffff int Max(int a ...
- 转载 - Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LTS)
出处:http://www.cnblogs.com/ifantastic/p/3185665.html Vim 的 Python 编辑器详细配置过程 (Based on Ubuntu 12.04 LT ...
- 最小生成树 I - Agri-Net
Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet c ...
- 工作流框架Activiti
最近在看一些项目设计方面的文章,涉及到了工作流技术,于是了解一下. 1.概念 工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照 ...
- something interesting when read docs
When you kill a session with "ALTER SYSTEM KILL SESSION '' ". If the session is performin ...