Django 4.x File文件上传使用示例和配置方法

在 Django 中当从表单 POST 文件时,文件数据存储在 request.FILES 中。

为此需要在 HTML 表单中设置标签,此部分为默认。

如果没有设置则不会存储已发布的文件,并且 request.FILES 将保持为空。

request.FILES 本身是一个 dict 类型的对象,并且分配了键的名称部分,然后将该值分配给实际的文件实例。

可以不使用模型上传文件,但 Django 提供了适合上传文件的名为 FileField 和 ImageFileld 的字段。上传到这两个字段的文件不是保存在数据库中,而是保存在文件系统中。然后保存文件的参考信息作为字符串字段保存在数据库中。


文件上传配置

settings.py 中设置 MEDIA_ROOT 和 MEDIA_URL 。

MEDIA_URL = '/media/'MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

url.py 中设置路由。

from django.conf import settingsfrom django.conf.urls.static import staticurlpatterns = [    # ......]if settings.DEBUG:    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)



文件上传方式

基本上传方式

以 FileSystemStrage 的上传举例。

模板文件 :basic_upload.html

{% extends 'base.html' %}{% load static %}{% block content %}  
{% csrf_token %}
{% if upload_file_url %}

上传时间{{ upload_file_url }}

{% endif %}

返回

{% endlock %}

视图文件 :views.py

from django.shortcuts import renderfrom django.conf import settingsfrom django.core.files.storage import FileSystemStoragedef simple_upload(request):    if request.method == 'POST' and request.FILES['myfile']:        myfile = request.FILES['myfile']        fs = FileSystemStorage()        filename = fs.save(myfile.name, myfile)        uploaded_file_url = fs.url(filename)        return render(request, 'simple_upload.html', {            'uploaded_file_url': uploaded_file_url        })    return render(request, 'simple_upload.html')

Form 上传文件

可以使用 Django 的标准 ModelForm 在此处上传文件。可以指定验证的绝对路径,详细保存目的地(分支也可以)。

模型文件 models.py

from django.db import modelsclass Document(models.Model):    description = models.CharField(max_length=50, blank=True)    document = models.FileField(upload_to='file/')    uploaded_at = models.DateTimeField(auto_now_add=True)

表单验证 form.py

from django import formsfrom upload.models import Documentclass DocumentForm(forms.ModelForm):    class Meta:        model = Document        fields = ('description', 'document', )

视图文件 views.py

def modelform_upload(request):    if request.method == 'POST':        form = DocumentForm(request.POST, request.FILES)        if form.is_valid():            form.save()            return redirect('index')    else:        form = DocumentForm()    return render(request, 'form_upload.html', {        'form': form    })

设置文件保存目的地

在 models.py 中定义字段时指定保存在设置的 /MEDIA_ROOT/documents/ 中。

document = models.FileField(upload_to='documents/')

还可以设置时间日期进行自动分开保存。

document = models.FileField(upload_to='documents/%Y/%m/%d/')

也可以根据文件类型进行判断进行保存。

def path_branch(instance, filename):    root_ext_pair = os.path.splitext(filename)    if root_ext_pair[1] = '.pdf':        path = os.path.join('documents/%Y/%m/%d/PDF/', filename)    elif root_ext_pair[1] = '.csv':        path = os.path.join('documents/%Y/%m/%d/CSV/', filename)    else:        path = os.path.join('documents/%Y/%m/%d/Others/', filename)    return pathclass FileDocuments(models.Model):    upload = models.FileField(upload_to=path_branch)

File参数说明

DEFAULT_FILE_STORAGE

Django默认的存储类,默认固定不需要修改。

DEFAULT_FILE_STORAGE = 'django.core.files.storage.FileSystemStorage'

2.FILE_UPLOAD_HANDLERS

用于上传的处理程序列表,可以自定义。

FILE_UPLOAD_HANDLERS = [    # 将小文件读取到内存    'django.core.files.uploadhandler.MemoryFileUploadHandler',     # 大文件放置在磁盘中    'django.core.files.uploadhandler.TemporaryFileUploadHandler',]

FILE_UPLOAD_MAX_MEMORY_SIZE

上载流传输到文件系统之前的最大大小(以字节为单位),小于该设置则在内存中读取和写入,速度快。

# 2621440即2.5 MBFILE_UPLOAD_MAX_MEMORY_SIZE = 2621440

FILE_UPLOAD_DIRECTORY_PERMISSIONS

数字模式,适用于在文件上传过程中创建的目录,此设置还确定使用collectstatic管理命令时所收集静态目录的默认权限,默认固定不需要修改。

FILE_UPLOAD_DIRECTORY_PERMISSIONS = None

FILE_UPLOAD_PERMISSIONS

设置上传文件的格式权限,只有拥有者有读写权限;而属组用户和其他用户只有读权限,默认固定不需要修改。

FILE_UPLOAD_PERMISSIONS = 0o644

FILE_UPLOAD_TEMP_DIR

Django将为操作系统使用标准的临时目录,默认固定不需要修改。

FILE_UPLOAD_TEMP_DIR = None

MEDIA_ROOT

存放用户上传文件的目录的绝对文件系统路径。

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

MEDIA_URL

用于管理从其提供的媒体,用于管理存储的文件。

MEDIA_URL = ' ' urlpatterns = [    ......    url(r'^media/(?P.*)#39;, static.serve, {'document_root': settings.MEDIA_ROOT}, name='media'),]




发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章