在 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 %} {% if 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')
可以使用 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)
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',]
上载流传输到文件系统之前的最大大小(以字节为单位),小于该设置则在内存中读取和写入,速度快。
# 2621440即2.5 MBFILE_UPLOAD_MAX_MEMORY_SIZE = 2621440
数字模式,适用于在文件上传过程中创建的目录,此设置还确定使用collectstatic管理命令时所收集静态目录的默认权限,默认固定不需要修改。
FILE_UPLOAD_DIRECTORY_PERMISSIONS = None
设置上传文件的格式权限,只有拥有者有读写权限;而属组用户和其他用户只有读权限,默认固定不需要修改。
FILE_UPLOAD_PERMISSIONS = 0o644
Django将为操作系统使用标准的临时目录,默认固定不需要修改。
FILE_UPLOAD_TEMP_DIR = None
存放用户上传文件的目录的绝对文件系统路径。
MEDIA_ROOT = ' 'MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
用于管理从其提供的媒体,用于管理存储的文件。
MEDIA_URL = ' ' urlpatterns = [ ...... url(r'^media/(?P.*)#39;, static.serve, {'document_root': settings.MEDIA_ROOT}, name='media'),]
留言与评论(共有 0 条评论) “” |