一、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. 折线分割平面(hdoj 2050,动态规划递推)

    Problem Description 我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面 ...

  2. Luogu P2176 [USACO14FEB]路障Roadblock

    解题思路 这是一道最短路题目,不知道大家有没有做过玛丽卡这道题目,如果没做,在做完这道题之后可以去拿个双倍经验哦 先求出一张图中的最短路径,并将其记录下来,我们首先思考:要有增量的前提是新的最短路径比 ...

  3. UVA - 1608 Non-boring sequences(分治法)

    题目: 如果一个序列的任意连续的子序列中至少有一个只出现一次的元素,则称这个序列是不无聊的.输入一个n(n≤200000)个元素的序列A(各个元素均为109以内的非负整数),判断它是不是不无聊的. 思 ...

  4. list tuple dict (列表,元祖,字典间的相互转换)

    #-*- coding:UTF-8 -*- #author:RXS002 #1.字典 dict = {'name':'Zara','age':7,'class':'First'} #字典转换为字符串, ...

  5. saltstack(六) saltstack Job管理

    一,简介 Jid: job id 格式为%Y%m%d%H%M%S%f master在下发指令消息时,会附带上产生的jid,minion在接收到指令开始执行时,会在本地的cachedir(默认是/var ...

  6. HDU 2082 母函数法

    #include <cstdio> #include <cstring> using namespace std; ] , dp[][]; int main() { // fr ...

  7. noip模拟赛 运

    [问题背景]zhx 和妹子们玩数数游戏.[问题描述]仅包含 4 或 7 的数被称为幸运数.一个序列的子序列被定义为从序列中删去若干个数, 剩下的数组成的新序列.两个子序列被定义为不同的当且仅当其中的元 ...

  8. Ajax提交post请求返回404错误

    最近使用ajax提交表单的时候,发现无法执行success函数,后台的代码也正常执行了,但是就是无法执行success函数,执行error函数,返回的错误代码时404.显然是找不到请求的url. 可是 ...

  9. 非常适合新手的jq/zepto源码分析04

    $.extend = function(target){ var deep, args = slice.call(arguments, 1) if (typeof target == 'boolean ...

  10. 项目中应用到的框架和技术之一——Materialize

    一群做C++的老伙计搞前端开发,徒手写html和css应该会折寿..在网上找了半天,Materialize算是用起来很方便的一款前端界面框架.Google的Material Design看起来感觉还是 ...