一、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. Microsoft SQL Server 存储过程

    Microsoft SQL Server 存储过程 TRIGGER DDL触发器:主要用于防止对数据库架构.视图.表.存储过程等进行的某些修改:DDL事件是指对数据库CREATE,ALTER,DROP ...

  2. JS设计模式—节流模式的实际应用

    在实际工作中,我们会经常遇到这样的业务场景,比如点击按钮提交表单,点击一次发一次请求,如果快速点击多次会发送多次请求,这样发送了多次请求是我们不愿意看到的.又比如输入框我们输入内容会调搜索的接口,那么 ...

  3. 洛谷——P1349 广义斐波那契数列(矩阵加速)

    P1349 广义斐波那契数列 题目描述 广义的斐波那契数列是指形如$an=p\times a_{n-1}+q\times a_{n-2}$?的数列.今给定数列的两系数$p$和$q$,以及数列的最前两项 ...

  4. MarkDown语法和使用

    MarkDown语法: Markdown在线编辑器 MdEditor Markdown 语法整理大集合2017 MarkDown 数学公式 在Markdown中输入数学公式(MathJax) \(\l ...

  5. C++ volatile关键字(转)

    文章来源: http://hedengcheng.com/?p=725 https://www.cnblogs.com/god-of-death/p/7852394.html 1.基本概念 volat ...

  6. Linux无人值守安装系统

    yum install dhcp -yvim /etc/dhcp/dhcpd.conf--------------------------------------------- allow booti ...

  7. Missing message for key "xxx" in bundle "(default bundle)" for locale zh_CN

    参考文章http://programmerslounge.blogspot.com/2013/03/error-missing-message-for-key.html 错误的struts-confi ...

  8. 对于 前端请求Django 后端服务出现403 Forbidden (CSRF token missing or incorrect.) 问题的解析

    Django中使用ajax post向後臺傳送資料時403 Forbidden (CSRF token missing or incorrect.):的解決辦法 在Django中使用ajax post ...

  9. ZooKeeper实现配置中心的实例(原生API实现)(转)

    说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应 ...

  10. Java中原始数据类型存放位置理解

    原始数据类型的变量存放在栈还是堆,应该由上下文去决定. 如下所示的局部方法中,定义了本地变量a,且为原始数据类型,所以存放在栈中. public void func(){ int a = 3; } 再 ...