Django基础(17): 如何上传处理文件,文件格式验证及Ajax文件上传示范(附GitHub源码)

本文详细介绍了Django处理文件上传的三种方式:普通表单、ModelForm和Ajax,涵盖了文件存储、验证及重命名,并提供了GitHub源码。通过实例展示了如何设置上传路径、限制文件类型以及实现Ajax无刷新上传。
摘要由CSDN通过智能技术生成

小编我今天要写篇值得大家收藏的文章。我将重点解释Django上传处理文件中需要考虑的重要事项,并提供一般文件上传及Ajax文件上传的示范(附GitHub源码)。如果你的项目需要用到文件上传,你可以从GitHub获取源代码,简化你的开发。

 

Django文件上传需要考虑的重要事项

 

文件一般通过表单进行。用户在前端点击文件上传,然后以POST方式将数据和文件提交到服务器。服务器在接收到POST请求后需要将其存储在服务器上的某个地方。Django默认的存储地址是相对于根目录的/media/文件夹,存储的默认文件名就是文件本来的名字。上传的文件如果不大于2.5MB,会先存入服务器内存中,然后再写入磁盘。如果上传的文件很大,Django会把文件先存入临时文件,再写入磁盘。

 

Django默认处理方式会出现一个问题,所有文件都存储在一个文件夹里。不同用户上传的有相同名字的文件可能会相互覆盖。另外用户还可能上传一些不安全的文件如js和exe文件,我们必需对允许上传文件的类型进行限制。因此我们在利用Django处理文件上传时必需考虑如下3个因素:

  • 设置存储上传文件的文件夹地址

  • 对上传文件进行重命名

  • 对可接受的文件类型进行限制(表单验证)

本文将会讲解在Django示范代码中如何实现上述3个功能。

 

Django文件上传的3种常见方式

 

Django文件上传一般有3种方式(如下所示)。我们会针对3种方式分别提供代码示范。

  • 使用一般的表单上传,在视图中手动编写代码处理上传的文件

  • 使用由模型创建的表单(ModelForm)上传,使用form.save()方法自动存储

  • 使用Ajax实现文件异步上传,上传页面无需刷新即可显示新上传的文件

 

项目创建与设置

我们先使用django-admin startproject命令创建一个叫file_project的项目,然后cd进入file_project, 使用python manage.py startapp创建一个叫file_upload的app。

 

我们首先需要将file_upload这个app加入到我们项目里,然后设置/media/和/STATIC_URL/文件夹。我们上传的文件都会放在/media/文件夹里。我们还需要使用css和js这些静态文件,所以需要设置STATIC_URL。

#file_project/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'file_upload',
]

#file_project/settings.py

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

# specify media root for user uploaded files,
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

#file_project/urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('file/', include("file_upload.urls")),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

创建模型

使用Django上传文件创建模型不是必需,然而如果我们需要对上传文件进行系统化管理,模型还是很重要的。我们的File模型包括file和upload_method两个字段。我们通过upload_to选项指定了文件上传后存储的地址,并对上传的文件进行了重命名。如果你想了解如何自定义用户上传文件夹地址和对上传文件进行重命名,请阅读这里

 

#file_upload/models.py

from django.db import models
import os
import uuid

# Create your models here.
# Define user directory path

def user_directory_path(instance, filename):
    ext = filename.split('.')[-1]
    filename = '{}.{}'.format(uuid.uuid4().hex[:10], ext)
    return os.path.join("files", filename)


class File(models.Model):
    file = models.FileField(upload_to=user_directory_path, null=True)
    upload_method = models.CharField(max_length=20, verbose_name="Upload Method")

注意:

  • 如果你不使用ModelForm,你还需要手动编写代码存储上传文件。

 

URLConf配置

本项目一共包括5个urls, 分别对应普通表单上传,ModelForm上传和Ajax上传。还有两个urls,一个用来显示文件清单,一个专门处理ajax请求。

#file_upload/urls.py

from django.urls import re_path, path
from . import views

# namespace
app_name = "file_upload"

urlpatterns = [

    # Upload File Without Using Model Form
    re_path(r'^upload1/$', views.file_upload, name='file_upload'),

    # Upload Files Using Model Form
    re_path(r'^upload2/$', views.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值