zoukankan      html  css  js  c++  java
  • django文件上传地址以及media的设置

    一、关于media的设置

    django的media文件地址的设置其实是类似于static文件地址的设置。

    media主要是用来存放一些用户上传的文件(头像、图片等)

    分为三个部分:

    一是在proj中建立一个media文件夹,文件夹名字可任意取,为方便起见,此处就取名为media。

    二是在setting中设置MEDIA_ROOT和MEDIA_URL

    #用户文件存放位置
    MEDIA_ROOT= os.path.join(BASE_DIR,'media')
    MEDIA_URL = '/media/'

    MEDIA_URL是media文件夹的url地址,也就是在前端访问时,使用  /media/ 这个url,到后端django会自动将该URL转换为MEDIA_ROOT这个实际地址,但是需要进行第三步设置之后才能够进行自动转换。

    三是在proj的url中进行设置:

    from django.contrib import admin
    from django.urls import path, include
    from django.conf.urls.static import static
    from zl_prac import settings
    
    urlpatterns = [
                      path('admin/', admin.site.urls),
                  ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

    也就是在urlpatterns后进行转换。

     二、关于文件上传地址upto的设置

    用django开发,经常要处理用户上传的文件, 比如user模型里面如果又个人头像的字段 ImageField等等,而django在FielField字段(包括ImageField)的支持和扩展是做的很好的,首先一个问题,是上传的文件怎样才能放到我们想要放大的位置( 文件流是不会放到数据库里面的,该字段在数据库中只存储路径)。

    一般情况下,用户上传的文件可以放在media/username下的细分文件夹,但是如何为不同的用户指定不同的路径呢?

    django提供了upload_to属性 
         以下介绍upload_to的具体使用方法。

    注意:

    如果setting中已经指定了media设置,那么,upload_to中的文件地址只要是相对地址,则都是存放在media文件夹下的。如果没有设置,则存放在根目录下。

    下面的方法都是默认设置了media文件夹。

    如果upload_to中的指定的文件夹不存在,则会自动创建。

    1.直接指定固定地址:

    在model中直接指定一个固定的地址

    class User(models.Model):
        avatar = ImageField(upload_to = 'avatar/')

    实际存放地址为  media/avatar/filename

    2. 使用strftime函数

    如果指定固定文件夹,则可能会存在多人上传的不同文件重名情况,这时候需要解决文件名冲突。方法就是按照上传的时间不同来存放。

    为了避免重名,django在upload_to上内置了strftime()函数。将时间插入

    # models.py
    class User(models.Model):
        avatar = ImageField(upload_to = 'avatar/%Y/%m/%d/')

    %Y、%m、%d分别表示年、月、日

    存储路径为   media/avatar/年/月/日

    3.利用函数生成地址

    以上两种方式都不能解决不同的用户使用不同的文件夹的情况。可以使用自定义函数来解决这个问题:

    #让上传的文件路径动态地与user的名字有关
    def upload_to(instance, fielname):  #返回一个路径名即可。调用时会自动传入user实例和filename两个参数。函数名也不一定需要叫upload_to,只要传入此函数即可。
        return '/'.join([MEDIA_ROOT, instance.user_name, filename])
    
    class User(models.Model):
        avatar = ImageField(upload_to = upload_to)
        user_name = CharField(max_length = 250)

    这里定义的upload_to返回的是一个绝对地址,改地址保存在数据库中,但是不利于网络的访问,需要就行如下修改:

    def up_to(instance, filename):
            return '/'.join([instance.uid, str(int(time.time())) + '_' + filename])

    此函数返回的是一个相对地址,django会自动将该相对地址放在 media之下。

    其真实存储地址为   /media/返回地址

    数据库中则直接存放的是返回的地址。

    这样前端想访问时,直接使用:

     <img id="img_thumbnail" src="/media/{{ user.avatar}}" alt="头像">

    注意,在前端使用的这个 /media/ ,并不是真正的meida文件夹,而是在setting中设置的MEDIA_URL。

  • 相关阅读:
    推荐]历史上最强的绕口令
    超级经理人的关系学:打造黄金人脉
    个人创业的难点和解决之道
    你的人脉关系中不可缺少的十种人[推荐]
    哲理短文一则:揭示最好的成功法则
    [经验交流]太精彩,太有启发性了(经典经典) 转
    权力领域是人才浪费的致命区域
    2006创业完全手册
    爱你我的宝贝(转)
    最远的你是我最近的爱
  • 原文地址:https://www.cnblogs.com/ohahastudy/p/11179493.html
Copyright © 2011-2022 走看看