django中通过文件和Ajax来上传文件
一、通过form表单来上传文件
1.在html模板中
<form action="/index/" method="post" enctype="multipart/form-data">
#在form属性中写入enctype="multipart/form-data" 这样form表单才能支持数据文件的提交
{% csrf_token %}
头像<input type="file" name="touxiang" id="file">
<br>
<label for="name">用户名</label>
<input type="text" id="name" name="username">
<button id="btn">提交</button>
</form>
2.在views视图中写入
def index(request):
if request.method == 'GET':
return render(request,'index.html')
else:
uname = request.POST.get('username')
file = request.FILES.get('touxiang') #获取文件要通过.FILES.get()来获取文件数据
file_name = file.name
path = os.path.join(settings.BASE_DIR,'statics','img',file_name)#来拼接文件内路径
with open(path,'wb')as f:#将文件写入本地
for i in file:
f.write(i)
return HttpResponse(uname)
当在后端接收文件内容的时候用FILES来接收,否者只能接收到文件名,
当用request.FILES.get('file')接收到之后,会接收到一个类似于文件句柄的数据类型,可以通过循环来读取文件,当文件是视频的时候,可以用句柄.chunks()来接收固定大小的文件,防止内存被占满
chunks()默认返回大小经测试位65536b,也就是64kb,最大是2.5MB,是一个生成器
二、Ajax来上传文件
1.在HTML模板中
$('#btn').click(function () {
var formdata = new FormData();#ajax上传文件的时候,需要这个类型,它会将添加的键值对加工成formata的类型
formdata.append('uname',$('#name').val());#添加键值对的方法是append,注意写法,键和值之间使用逗号隔开
formdata.append('files',$('#file')[0].files[0]);
formdata.append('csrfmiddlewaretoken',$('[name=csrfmiddlewaretoken]').val());#别忘了csrf_tocken
$.ajax({
'url':"{% url 'index' %}",
'type':'post',
'data':formdata,#将添加好的formdata放到data这里
processData:false, //不处理数据
contentType:false,//不设置内容类型
success:function (res) {
console.log(res)
}
})
})
2.在视图函数中
def index(request):
if request.method == 'GET':
return render(request,'index.html')
else:
name = request.POST.get('uname')#获取POST请求发送过来的数据
file = request.FILES.get('tou')#获取上传文件的数据
file_name = file.name#获取文件名
path = os.path.join(settings.BASE_DIR,'statics','img',file_name)#拼接文件路径
with open(path,'wb')as f:#将文件写入本地
for i in file.chunks():
f.write(i)
三、JsonResponse
def index(request):
if request.method == 'GET':
return render(request,'index.html')
else:
# dd = {'k1':'v1','k2':'v2'}
# dd = json.dumps(dd)
# return HttpResponse(dd,content_type='application/json') #在发送的时候发送一个cntent_type='application/json'响应体,发送到模板中的ajax中会自动调用ajax的反序列化,就不需要手动反序列化了
#在python中同样也有,那就是JsonResponse对象
JsonResponse对象是HttpResponse的子类,专门用来生成JSON编码的响应
from django.http import JsonResponse #导入JsonResponse
dd = {'k1':'v1','k2':'v2'}
return JsonResponse(dd) #这样就不需要自己手动序列化了,也不需要自己手动写响应体了
dd = [11,22,33]
return JsonResponse(dd,safe=False)#当序列化的是一个非字典的时候就需要safe=false,
四、json序列化时间日期类型的数据的方法
import json
from datetime import datetime
from datetime import date #对含有日期格式数据的json数据进行转换
class JsonCustomEncoder(json.JSONEncoder):
def default(self, field):
if isinstance(field,datetime):
return field.strftime('%Y-%m-%d %H:%M:%S')
elif isinstance(field,date):
return field.strftime('%Y-%m-%d')
else:
return json.JSONEncoder.default(self,field) d1 = datetime.now() dd = json.dumps(d1,cls=JsonCustomEncoder) #当再调用json的时候就不能只写要序列化的数据了,在后面要写上cls=JsonCustomEncoder
print(dd)
django中通过文件和Ajax来上传文件的更多相关文章
- (23)ajax实现上传文件的功能
form表单上传文件 urls.py from django.conf.urls import urlfrom django.contrib import adminfrom app01 import ...
- Ajax方式上传文件
用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 For ...
- SSM框架下,使用ajax请求上传文件(doc\docx\excel\图片等)
1.准备工作 1.1.添加上传必要jar包 <dependency> <groupId>commons-io</groupId> <artifactId> ...
- 基于Ubuntu Server 16.04 LTS版本安装和部署Django之(三):设置上传文件夹权限(这里测试用完全共享)
基于Ubuntu Server 16.04 LTS版本安装和部署Django之(一):安装Python3-pip和Django 基于Ubuntu Server 16.04 LTS版本安装和部署Djan ...
- ajax异步上传文件和表单同步上传文件 的区别
1. 用表单上传文件(以照片为例)-同步上传 html部分代码:这里请求地址index.php <!DOCTYPE html> <html lang="en"&g ...
- ajax如何上传文件(整理)
ajax如何上传文件(整理) 一.总结 一句话总结:用FormData,FormData+ajax=异步上传二进制文件 <form enctype="multipart/form-da ...
- 基于Flask开发网站 -- 前端Ajax异步上传文件到后台
大家好,我是辰哥~ 辰哥最近利用空闲时间在写一个在线可视化平台,过程中也觉得一些技术还是比较有意思的,所以就以模块化的形式分享出来.如:从网页界面(前端)上传文件到服务器(后端). 放一下该模块的界面 ...
- SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html
SpringMVC上传压缩文件,解压文件,并检测上传文件中是否有index.html 说明: 1.环境:SpringMVC+Spring+Tomcat7+JDK1.7 2.支持 zip和rar格式的压 ...
- koa2:通过Ajax方式上传文件,使用FormData进行Ajax请求
koa2通过表单上传的网上很多,但通过Ajax方式上传文件,使用FormData进行Ajax请求,不好找. 参考了这个用base64上传图片的例子.https://github.com/Yuki-Mi ...
随机推荐
- 高并发 Nginx+Lua OpenResty系列(1)——环境搭建
OpenResty是一款基于Nginx的高性能负载均衡服务器容器,简单来说是Nginx+Lua.结合了Lua语言来对Nginx进行扩展,使得在Nginx上具有web容器功能. OpenResty运行环 ...
- 高并发IM系统架构优化实践
互联网+时代,消息量级的大幅上升,消息形式的多元化,给即时通讯云服务平台带来了非常大的挑战.高并发的IM系统背后究竟有着什么样的架构和特性? 以上内容由网易云信首席架构师内部分享材料整理而成 相关阅读 ...
- centos7搭建基于SAMBA的网络存储
学习目标: 通过本实验理解Linux系统下SAMBA服务器和客户端的配置,实现客户机可自动挂载服务端的共享存储. 操作步骤: 1. SAMBA服务器搭建 2. SAMBA客户端配置 参考命令: ...
- 浅谈Invoke 和 BegionInvoke的用法
很多人对Invoke和BeginInvoke理解不深刻,不知道该怎么应用,在这篇博文里将详细阐述Invoke和BeginInvoke的用法: 首先说下Invoke和BeginInvoke有两种用法: ...
- CentOS7搭建LNMP环境
以前写的过时了,重新发一篇新的. 安装PHP 下载官网:https://www.php.net/downloads.php 为了方便,我存了现成的 百度网盘:https://pan.baidu.com ...
- JUnit-4.13使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
今天重新复习spring的时候,调用Junit架包来进行测试,进入其官网 https://junit.org/junit5/,点击右上角的Junit4进行查看 2.出现了的页面是这个样子 我把这个页 ...
- 第一个SpringBoot
Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置.用我 ...
- 微服务-springboot-rabbitmq:实现延时队列
延时队列应用于什么场景 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费.那么,为什么需要延迟消费呢?我们来看以下的场景 网上商城下订单后30分钟后没有完成支 ...
- 2018.8.17 2018暑假集训 关于dp的一些感想(以目前的知识水平)
学了这么长时间的dp似乎还是不怎么样 谨以此篇文字记录一年以来与dp斗智斗勇的各种经历 关于dp(也就是动态规划)似乎对于每个OIer来说都是一个永远的噩梦. 刚刚开始学dp的时候完全搞不明白(只是觉 ...
- Redis在.net 环境下的使用
Redis概念 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,和Memcached类似,它支持存储的value类型相对更多,包括st ...