Django基础(13)_文件上传

 

 

form表单文件上传

<form action="" method="post" enctype="multipart/form-data"> 
    {% csrf_token %}
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    头像: <input type="file" name="avatar" multiple>   <!--添加multiple则可以上传多个文件-->
    <input type="submit">
</form>

 

若没有指定 multipart/form-data , 则提交的头像信息会在request.POST中,但只是一个文件名字,指定了则没有头像信息

指定后的content-type变为: 

 

 客户端接收文件

def upload(request):
    if request.method == 'POST':
        print(request.POST)  # 若没有修改请求消息格式(content-type),那么文件名称会在request.POST中拿到,但是只是文件名称
        # 里面放的是数据信息,类似于文件句柄
        print(request.FILES)  # <MultiValueDict: {'avatar': [<InMemoryUploadedFile: 1606968635000.png (image/png)>]}>
        file_obj = request.FILES.get('avatar')
        print(file_obj.name)  # 文件名称  1606968635000.png
        # 保存文件,默认根目录
        with open(file_obj.name, 'wb') as f:  # 这里的file_obj.name 可以是随便指定的一个名字
            for i in file_obj.chunks():  # 默认一次返回大小经测试为65536B,也就是64KB,最大为2.5M,是一个生成器
                '''使用chunks是因为循环obj时是按照空格进行写入, 若文件没有空格啥的不就那啥了'''
                f.write(i)
        return HttpResponse('ok')
    return render(request, 'home/avatar.html')

 

 

ajax文件上传 

{body}
{% csrf_token %}
用户名: <input type="text" name="username">
密码: <input type="password" name="password">
{# 头像: <input type="file" name="avatar" multiple>#}
头像: <input type="file" name="avatar">
<button id="sub">提交</button>


</body>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$("#sub").click(function (){
var uname = $('[name="username"]').val();
var pwd = $('[name="password"]').val();
var file_obj = $('[type="file"]')[0].files[0];

// ajax上文件,必须将文件数据放到一个叫做formdata的对象中才能发送
var formdata = new FormData();
formdata.append('username',uname)
formdata.append('password',pwd)
formdata.append('csrfmiddlewaretoken', '{{ csrf_token }}')
formdata.append('avatar',file_obj) // requser.FILES.get('avatar')

$.ajax({
url:'/upload/',
type:'post',
data:formdata, // ajax会将本次请求的数据格式改为 content-type: multipart/form-data

// 告诉ajax不要对数据进行预处理和加工,向上传文件必须加上这两个参数
contentType:false,
processData: false,

success:function (res){

}
})
});
</script>

 views中和form表单提交一样

 

posted @ 2020-12-03 17:34  死里学  阅读(88)  评论(0)    收藏  举报