Django之AJAX文件上传

  文件上传:

·         一般文件上传都是采用post请求方式,get请求携带的数据有限,有post请求的数据放在请求体中,大小不受约束,但是在django的post请求中要注意csrf(防跨站伪造请求)认证机制;

·         文件上传使用的是multipart/form-data数据格式传输,在使用from表单时需要指定属性enctype="multipart/form-data";在使用ajax时要设置参数:processData: false,contentType: false,文件对象数据的获取需要通过js操作标签DOM对象的files属性取值获取($(‘#file‘)[0].files[0]单个文件),同时data数据使用FormData对象。在后端django将文件对象(类似文件句柄)保存在请求对象的request.FILES字典中。

·         在实际应用中,可以通过js代码操作DOM对象的files文件数组,获取到当前上传文件对象,判断文件格式和大小

 

form表单上传文件:

  upload.html

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
 6     <title>upload</title>
 7 </head>
 8 <body>
 9 <!--form上传文件:form标签必须加上enctype属性,指定内容传输格式-->
10 <div>
11     <form action="{% url ‘upload‘ %}" method="post" enctype="multipart/form-data">
12         {% csrf_token %}
13         用户名:<input type="text" name="username"><br>
14         密码:<input type="password" name="password"><br>
15         上传文件:<input type="file" name="file">
16         <br><input type="submit">
17     </form>
18 </div>
19 </body>
20 </html>

  urls.py

1 urlpatterns = [
2     url(r‘^admin/‘, admin.site.urls),
3     url(r‘^upload/‘, views.upload,name=‘upload‘),
4 ]

  views.py

 1 # form 表单上传文件:
 2     # form页面需要指定属性enctype=‘multipart/form-data‘
 3     #后端获取文件用request.FILES
 4
 5 def upload(request):
 6     if request.method==‘GET‘:
 7         return render(request,‘upload.html‘)
 8     elif request.method==‘POST‘:
 9         name=request.POST.get(‘username‘)
10         psd=request.POST.get(‘password‘)
11
12         # 文件获取用FILES,获取的file_obj类似文件句柄
13         file_obj=request.FILES.get(‘file‘)#文件对象
14         file_name = file_obj.name   #文件名
15
16         # print(‘>>>>‘,file_obj,type(file_obj))
17         # print(file_name)
18
19         #下载写入文件
20         file_path=os.path.join(settings.BASE_DIR,‘upload_files‘,file_name)
21         with open(file_path,‘wb‘)as f:
22             # (1)文件过大不宜使用
23             ‘‘‘
24             f.write(file_obj.read())
25             ‘‘‘
26             # (2)每次读取以\r\n为界,数据长度不固定,没有\r\n数据会很大,不宜使用
27             ‘‘‘
28             for data in  file_obj:
29                 f.write(data)
30             ‘‘‘
31             #(3)chunks()默认一次返回大小为经测试为65536B,也就是64KB,最大为2.5M,是一个生成器
32             for chunk in file_obj.chunks():
33                 f.write(chunk)
34
35         return HttpResponse(‘form上传文件‘)
36  

AJAX上传文件:

  upload.html 

 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
 6     <title>upload</title>
 7 </head>
 8 <body>
 9 <!--ajax上传文件-->
10 <div>
11     {% csrf_token %}
12     用户名:<input type="text" id="username"><br>
13     密码:<input type="password" id="password"><br>
14     上传文件:<input type="file" id="file"><br>
15     <input type="button" id="submit" value="ajax上传文件">
16 </div>
17 </body>
18 <script>
19     $(function () {
20         $(‘#submit‘).click(function () {
21             //ajax上传文件必须通过FormData对象传输数据
22             var formdata = new FormData();
23
24             var username = $(‘#username‘).val();
25             var psd = $(‘#password‘).val();
26             var csrf_data = $(‘input[name=csrfmiddlewaretoken]‘).val();
27             //获取上传文件对象(文件句柄):定位对象,转成DOM对象,取值(文件对象列表)
28             var file = $(‘#file‘)[0].files[0];
29
30             formdata.append(‘username‘, username);
31             formdata.append(‘psd‘, psd);
32             formdata.append(‘csrfmiddlewaretoken‘, csrf_data);//csrf认证的键是固定的
33             formdata.append(‘file‘, file);
34
35             $.ajax({
36                 url: "{% url ‘upload‘ %}",
37                 type: ‘post‘,
38                 data: formdata,
39                 processData: false,//不处理数据
40                 contentType: false,//不设置内容类型,按原格式传输
41                 success: function (response) {
42                     alert(response)
43                 }
44             })
45         })
46     })
47 </script>
48 </html>

urls.py

1 urlpatterns = [
2     url(r‘^admin/‘, admin.site.urls),
3     url(r‘^upload/‘, views.upload,name=‘upload‘),
4 ]

  views.py

 1 # ajax上传文件
 2 def  upload(request):
 3     if request.method==‘GET‘:
 4         return render(request,‘upload.html‘)
 5     elif request.method==‘POST‘:
 6         name = request.POST.get(‘username‘)
 7         psd = request.POST.get(‘password‘)
 8         file_obj = request.FILES.get(‘file‘)
 9         file_name = file_obj.name
10         print(‘>>>>‘,file_name)
11         # 拼接绝对路径
12         file_path = os.path.join(settings.BASE_DIR, ‘upload_files‘, file_name)
13         with open(file_path, ‘wb‘)as f:
14             for chunk in file_obj.chunks():#chunks()每次读取数据默认我64k
15                 f.write(chunk)
16         return HttpResponse(‘ajax上传文件‘)

 

原文地址:https://www.cnblogs.com/open-yang/p/11222399.html

时间: 2024-10-11 04:29:23

Django之AJAX文件上传的相关文章

Ajax文件上传组件

项目中经常需要文件上传,每次都要重复造轮子,所以决定将文件上传做成组件,方便使用.效果如图: 自我感觉效果还是可以的,而且使用的代码也变得十分清晰,前端的html代码非常简洁,如下: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <link href = "fileuploader.css&quo

【Jsp】使用AjaxFileUploader与jspsmartupload完成不刷新的Ajax文件上传系统

这个不刷新的Ajax文件上传系统同样可以用来做预览图 虽然预览图完全可以通过不上传图片就完成,但是不刷新的Ajax文件上传系统可以做到上传完图片立即返回上传结果给用户的结果 上次在<[Jsp]使用jspsmartupload完成简单的文件上传系统>(点击打开链接)一文中完成了一个简单的文件上传系统 但是这个文件上传系统过于传统, 上传完文件之后需要跳转到另外一个页面中提交表单,处理表单,然后再提供一个"返回"按钮给用户 如果用户要求上传之后,马上看到图片,并且不跳转,只好利

Javascript Fromdata 与jQuery 实现Ajax文件上传以及文件的删除

前端HTML代码: <!DOCTYPE html> <html> <head> <title>ajax</title> <script type="text/javascript" src="js/jquery.js"></script> <meta charset="utf-8" /> <style type="text/css&qu

Javascript Fromdata 与jQuery 实现Ajax文件上传

<!DOCTYPE html> <html> <head> <title>ajax</title> <script type="text/javascript" src="js/jquery.js"></script> <meta charset="utf-8" /> <style type="text/css"> fo

AJAX文件上传实践与分析,带HTML5文件上传API。

对于HTML5已经支持AJAX文件上传了,但如果需要兼容的话还是得用一点小技巧的,HTML5等等介绍,先来看看以前我们是怎么写的. 网上可能会有一些叫AJAX文件上传插件,但在AJAX2.0之前是不可能实现的,因为浏览器的原因,AJAX根本获取不了文件信息,当然这里并不是说就不能文件上传了,只是说在AJAX2.0之前所谓的AJAX文件上传都是假冒的,核心更本没有用AJAX,而是利用iframe实现的,下面我们来看看如何利用iframe实现页面无刷新上传文件. iframe无刷新上传文件版. ht

兼容ie的jquery ajax文件上传

Ajax文件上传插件很多,但兼容性各不一样,许多是对ie不兼容的,另外项目中是要求将网页内容嵌入到桌面端应用的,这样就不允许带flash的上传插件了,如:jquery uploadify...悲剧 对于Ajax文件上传,大体是有: 1.创建一个input type="file" 的文件上传按钮,根据其id监听绑定其change事件,在事件中用jquery创建一个iframe,嵌入添加隐藏form,同时创建input type="file",id相同的文件上传按钮,并

django 快速实现文件上传

前言 对于web开来说,用户登陆.注册.文件上传等是最基础的功能,针对不同的web框架,相关的文章非常多,但搜索之后发现大多都不具有完整性,对于想学习web开发的新手来说就没办法一步一步的操作练习:对于web应用来说,包括数据库的创建,前端页面的开发,以及中间逻辑层的处理三部分. 本系列以可操作性为主,介绍如何通过django web框架来实现一些简单的功能.每一章都具有完整性和独立性.使用新手在动手做的过程中体会web开发的过程,过程中细节请参考相关文档. 本操作的环境: ==========

使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html

使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },"json"); 又或者是这样的ajax $.ajax({ url:"${pageContext.request.contextPath}/public/testupload", type:"post", data:{username:username},

iframe实现Ajax文件上传效果示例

<!doctype html> <html> <head> <meta charset=utf-8> <head> <title>ajax 文件上传~~</title> </head> <script> window.onload=function(){ var form=document.getElementsByTagName('form')[0]; form.onsubmit=function