AJAX实现上传进度条(Django)

昨天研究了一天文件上传进度条的实现,折腾了一天终于是完成了,期间遇到了各种BUG,让人不禁泪落。

这里,我们将使用最少量的AJAX来实现这个功能,没有任何对浏览器支持性的检测,这样更容易明白。还有一点需要说明的是,后台也是应该来掺和一脚(配合)的,当然,非常简单,只要确认接受这个文件就行(后面将说明)。我使用的是Django框架来做的后台。

没什么好多说的,先上代码,代码中会给出详细的解释。先给出前端的:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<script>
		function on_progress(evt) {       //看这个函数之前先看upload函数。这个函数可以接收一个evt(event)对象(细节自行查询progress),他有3个属性lengthComputable,loaded,total,第一个属性是个bool类型的,代表是否支持,第二个代表当前上传的大小,第三个为总的大小,由此便可以计算出实时上传的百分比
			if(evt.lengthComputable) {
				var ele = document.getElementById('2');
				var percent = Math.round((evt.loaded) * 100 / evt.total);
				ele.style.width = percent + '%';
				document.getElementById('3').innerHTML = percent + '%';
			}
		}
		function upload() {
			var xhr = new XMLHttpRequest();
			var file = document.getElementById('file').files[0];   //取得文件数据,而.file对象只是文件信息
			var form = new FormData();   //FormData是HTML5为实现序列化表单而提供的类,更多细节可自行查询
            form.append('file',file);   //这里为序列化表单对象form添加一个元素,即file
			xhr.upload.addEventListener('progress',on_progress,false);     //xhr对象含有一个upload对象,它有一个progress事件,在文件上传过程中会被不断触发,我们为这个事件对应一个处理函数,每当事件触发就会调用这个函数,于是便可利用这个函数来修改当前进度,更多细节可自行查询
			xhr.open('POST','http://127.0.0.1:8000/upload/',true);  //请将url改成上传url
            xhr.setRequestHeader('X-CSRFTOKEN','{{ request.COOKIES.csrftoken }}');   //此处为Django要求,可无视,或者换成相应后台所要求的CSRF防护,不是django用户请去掉
			xhr.send(form);   //发送表单
		}
	</script>
</head>
<body>
	<form>
        {% csrf_token %}     //Django要求,不是Django用户请去除
		<div id='1' style="height:20px;width:100px;border:2px solid gray;float:left;margin-right:10px;">
			<div id='2' style="height:100%;width:0px;background:gray;"></div>

		</div>
		<b style="margin-right:20px" id='3'>0%</b>

		<input type="file" id='file' class='file' name="file"><br><br>
		<button type="button" οnclick="upload();">上传</button>

	</form>
</body>
</html>

好了,前端的事情已经干完了,接下来就是确保后台不会拒绝,也就是确认接受这个文件,当然还有一点便是上传界面也要由后台来提供,否则会出现跨域提交失败。在Django中大概就是下面这样:

urls.py有下面2个模式匹配
url(r'^upload_page/$', upload_page)
url(r'^upload/$', upload)
views.py有下面2个请求处理函数
def upload_page(request):
    return render(request,'upload_page.html')   #这里upload_page便是上面的前端html文件
def upload(request):
    file = request.FILES   #一定要调用上传的文件(不管你干嘛,保存也好,啥也不干也好,反正不调用就出错了,估计是默认不调用就不接收吧。。)才能用ajax上传成功,否则报错,原因不明
    return HttpResponse()

 
 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现应聘进度条,需要使用 Django 框架以及前端技术。以下是一种简单的实现方法: 1. 创建一个 Django 应用程序,例如“job_apply”。 2. 在 models.py 文件中,创建一个“JobApplication”模型,包含应聘者姓名、应聘职位、应聘状态等字段。 3. 在 views.py 文件中,创建一个“job_application_list”视图函数,用于显示所有应聘者的列表,并将数据传递给模板。 4. 在 templates 文件夹中,创建一个“job_application_list.html”模板,用于显示应聘者列表和进度条。 5. 在模板中,使用 Bootstrap 或其他前端框架创建一个进度条,将应聘者状态映射到进度条上。 6. 在模板中,使用 Django 模板语言遍历应聘者列表,并将应聘者的信息显示在表格中。 7. 在模板中,为每个应聘者创建一个“更新状态”按钮,点击后可以将应聘者状态更新为“面试通过”、“拒绝面试”等状态。 8. 在 views.py 文件中,创建一个“update_job_application_status”视图函数,用于处理状态更新请求,并将更新后的数据保存到数据库中。 9. 在 urls.py 文件中,将“job_application_list”和“update_job_application_status”视图函数分别映射到 URL 路径上。 10. 运行 Django 服务器,访问应聘者列表页面,就可以看到应聘进度条和每个应聘者的状态了。 注意,这只是一个简单的实现方法,您可以根据实际需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值