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)

原文地址:https://www.cnblogs.com/wang-xing-hao/p/11266487.html

时间: 2024-12-09 20:39:56

django中通过文件和Ajax来上传文件的相关文章

关于ajax分段上传文件实例~

本来打算写的勤快一点的,谁知道最近好忙啊,忙着应聘的事情,这里突然想提一下自己的历程 自己现在是一只大三狗,高中三年是玩过去了,上了一所省内普通的不能再普通的二本.不过在大学里还算的上勤奋,大一上在学生会搅搅水,大一下就开始在学校网络中心里面干活,网络维护是工作,编程是兴趣,基本上每天网络中心寝室两点一线,所以说还算得上勤奋.不过现在我自己算是明白,很多事情不是勤奋就好了的,方法不对,真的是事倍功半.自己之前学习东西都是瞎倒腾,看书,看视频,记笔记,写demo.看起来稀疏平常,但是自己缺点在于太

Ajax方式上传文件

用到两个对象 第一个对象:FormData 第二个对象:XMLHttpRequest 目前新版的Firefox 与 Chrome 等支持HTML5的浏览器完美的支持这两个对象,但IE9尚未支持 FormData 对象,还在用IE6 ? 只能仰天长叹.... 有了这两个对象,我们可以真正的实现Ajax方式上传文件. 示例代码: <!DOCTYPE html> <html> <head> <title>Html5 Ajax 上传文件</title>

jquery ajax实现上传文件代码,带进度条

原文:jquery ajax实现上传文件代码,带进度条 源代码下载地址:http://www.zuidaima.com/share/1550463291116544.htm ajax上传文件代码,带进度条的. 首页 http://localhost:端口/项目名/common/test.htm 上传中 标签: jquery ajax 上传 进度条话题: Web开发 前端技术 jquery ajax实现上传文件代码,带进度条

SSM框架下,使用ajax请求上传文件(doc\docx\excel\图片等)

1.准备工作 1.1.添加上传必要jar包 <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>commons-fileupload</groupId>

ajax jquery 上传文件

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ include file="/WEB-INF/jsp/commons/includes.jsp"%> <html> <head> <title>${systemName }</title> <style t

解决ajax异步上传文件的问题

HTML: <form id="avater" name="formlist"> {{ csrf_field() }} <ul class="list-group container" style="width:50%"> <li class="list-group-item list" style="border-radius: 5px"> <

上传文件按钮美化,上传文件前后状态控制

我们在做input文本上传的时候,html自带的上传按钮比较丑,如何对其进行美化呢?同理:input checkbox美化,input radio美化是一个道理的. input file上传按钮的美化思路是,先把之前的按钮透明度opacity设置为0,然后,外层用div包裹,就实现了美化功能. 注:input 的 type 为 file 时,它的 name 必须有值,因为这个 name 会做为上传文件信息的数组名称. <a href="javascript:;" class=&q

使用Jquery中ajax实现上传文件

html: <input type="file" name="uploadFile" id="uploadFile"> jq: $("#uploadFile").on("change", function() { var formData = new Formdata();                      // 创建一个form类型的数据 formData.append($("

使用django表单,使网页添加上传文件,并分析文件。

开发环境是: apache + python + django+ eclipse(开发环境) 欲达到目的: 在网页上,添加上传文件控件.然后读取csv文件,并分析csv文件. 操作步骤: django 是MVC的设计模式 (模型M,视图V,控制器C) 1.从django的基本模型中,构建自己的模型. 在myforms.py文件中添加如下代码,之后在html显示的表单数据就可以采用这个模型的数据了. from django import forms from django.views.decora