ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django中的文件操作

2020-01-13 20:02:52  阅读:187  来源: 互联网

标签:文件 name photo request upload 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:\code\django_test\static\img\icon.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()  # 数据库存储的是路径

标签:文件,name,photo,request,upload,Django,操作,上传
来源: https://www.cnblogs.com/huiyichanmian/p/12189048.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有