• Django中的文件操作


    一、静态文件的加载

    1、使用步骤

    ①、在工程目录下创建static目录,创建css/js/images等目录,并添加相关资源

    ②、在settings.py中配置STATICFILES_DIRS

    STATICFILES_DIRS = [
        os.path.join(BASE_DIR, "static"),
    ]

    ③、在模板中调用

      绝对路径:

    <link rel="stylesheet" href="/static/css/my.css">

      相对路径:

    {% load static %} 或 {% load staticfiles %}
    <img src="{% static 'images/bige.jpg' %}">

    2、重要配置

    ①、STATIC_URL

    静态资源的虚拟路径,会启动“静态资源探测器”

    ②、STATICFILES_DIRS

    “静态资源探测器”会首先去查找STATICFILES_DIRS配置里设置的目录下的静态资源;然后会去查找每个app下的static子目录下的静态资源

    ③、STATIC_ROOT

    可以通过"python manage.py collectstatic"命令将所有应用的静态资源收集到STATIC_ROOT指向的目录中

    二、文件上传

    本质上就是文件的读写操作,从一个文件读取,到另外一个文件写入。

    上传文件所在的表单必须设置enctype="multipart/form-data"

    <form method="post"
          action=""
          enctype="multipart/form-data">
        {% csrf_token %}
        <input name="name" placeholder="用户名"> <br>
        <input type="file" name="photo"><br>
        <button>提交</button>
    </form>

    1、Python代码实现

    将文件内容打碎,一块一块写入:chunks()

    def upload_file(request):
        if request.method == "GET":
            return render(request, 'upload.html')
        elif request.method == "POST":
            icon = request.FILES.get("icon")
    
            with open("G:codedjango_teststaticimgicon.jpg", 'wb') as save_file:   # 此处使用绝对路径
                for part in icon.chunks():
                    save_file.write(part)
                    save_file.flush()  # 写入一块就刷新一下,防止堵塞
    
            return HttpResponse("文件上传成功")

    2、ajax实现

    def ajax_upload(request):
        if request.method == 'GET':
            return render(request,'upload_ajax.html')
        else:
            name = request.POST.get('ajaxname')  # 接收文本框中的用户名
            upload_obj = request.FILES.get('ajaxphoto')  # 接收上传的文件,返回上传文件对象
            BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
            upload_path = os.path.join(BASE_DIR, 'upload','ajax', upload_obj.name)  # 拼接上传文件的路径
            with open(upload_path, 'wb') as f:
                for chunk in upload_obj.chunks():
                    f.write(chunk)
            data = {
                'status':'900',
                'msg':'恭喜,'+ name + '上传成功',
                'picpath':'ajax/'+ upload_obj.name,
            }
            return JsonResponse(data)
    <!DOCTYPE html>
    {% load static %}
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>ajax上传文件</title>
        <script src="{% static 'jquery-3.1.1.js' %}"></script>
    </head>
    <body>
        {% csrf_token %}
        <p>上传人: <input type="text" name="name"></p>
        <p>照片: <input type="file" name="photo"></p>
        <input type="button" value="点我上传" id="btn">
        <span id="msg"></span>
        <img src="" alt="" id="pic">
    </body>
    </html>
    <script>
        $('#btn').click(function(){
            var formData = new FormData(); //用来收集上传数据的对象
            formData.append('ajaxname',$('input[name="name"]').val()); //添加用户名
            formData.append('ajaxphoto',$('input[name="photo"]')[0].files[0]); //添加文件
            //alert($('input[name="photo"]')[0].files[0]);
            formData.append('csrfmiddlewaretoken',$('input[name="csrfmiddlewaretoken"]').val());  //添加token
            $.ajax("{% url 'upload:ajax' %}",{
                type:'POST',
                data: formData,
                contentType:false,
                processData:false,
                success:function (data) {
                    if(data.status=='900'){
                        $('#msg').html(data.msg);
                        var picpath = data.picpath;
                        $('#pic').attr('src','/static/'+picpath);
                    }
                }
            })
        })
    </script>

    3、Django内置

    ①、配置

    在settings.py文件中声明上传的路径。

    MEDIA_ROOT= os.path.join(BASE_DIR, 'static')

    ②、图片上传

    ImageField,专门用来处理图像上传,需要添加依赖pillow,pillow是专门处理图像的库

    pip install pillow

    ImageFiled中使用upload_to,需要指定上传后的目录

    photo = models.ImageField(upload_to='upload')  # 此处upload相当于MEDIE_ROOT

    ③、文件上传

    FileField,与图片上传一致

    ④、文件存储

    class Author(models.Model):
        name = models.CharField(max_length=20)
        photo = models.ImageField(upload_to='upload')
    name = request.POST.get("name")
    photo = request.FILES.get('photo')
    author = Author()
    author.name = name
    author.photo = photo
    author.save()  # 数据库存储的是路径

  • 相关阅读:
    shell 时间循环
    t
    IntelliJ IDEA For Mac 快捷键
    JVM的默认参数
    qt不同模块使用多语言
    cocos2dx 实现gpu instancing
    so so.*.*
    Android开发-解决 AIDL 中找不到couldn't find import for class错误
    Android Watchdog源码简析--Based on Android 6.0.1
    View绘制流程--Based on kitkat
  • 原文地址:https://www.cnblogs.com/huiyichanmian/p/12189048.html
Copyright © 2020-2023  润新知