Django – 使用 FileSystemStorage 上传文件
Django 附带了 FileSystemStorage 类,该类有助于在本地存储文件,以便这些文件可以在开发中用作媒体。在本文中,我们将看到如何使用 FileSystemStorage API 实现文件上传系统,将文件存储在本地。
注意:此方法只能用于开发,不能用于生产。
如何使用 FileSystemStorage 上传文件?
- 第 1 步:我们将首先制作一个模板表单来上传文件。
模板
HTML
Python3
if request.method == "POST":
# if the post request has a file under the input name 'document', then save the file.
request_file = request.FILES['document'] if 'document' in request.FILES else None
if request_file:
# save attached file
# create a new instance of FileSystemStorage
fs = FileSystemStorage()
file = fs.save(request_file.name, request_file)
# the fileurl variable now contains the url to the file. This can be used to serve the file when needed.
fileurl = fs.url(file)
return render(request, "template.html")
Python3
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # media directory in the root directory
MEDIA_URL = '/media/'
Python3
# only in development
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
- 在这里,请注意输入(用户可以通过它输入文件)的名称为“文档”。
- 第 2 步:现在,我们将在 `views.py` 文件中写入相同的视图
看法
首先,使用文件顶部导入 FileSystemStorage 类
from django.core.files.storage import FileSystemStorage
Python3
if request.method == "POST":
# if the post request has a file under the input name 'document', then save the file.
request_file = request.FILES['document'] if 'document' in request.FILES else None
if request_file:
# save attached file
# create a new instance of FileSystemStorage
fs = FileSystemStorage()
file = fs.save(request_file.name, request_file)
# the fileurl variable now contains the url to the file. This can be used to serve the file when needed.
fileurl = fs.url(file)
return render(request, "template.html")
- 在这里,FileSystemStorage 类的构造函数采用参数 'location',它是您要存储文件的目录的路径。默认情况下,它是变量“settings.MEDIA_ROOT”中的路径。它还接受参数“base_url”,这是您希望媒体对应的 url。默认情况下,它设置为变量“settings.MEDIA_URL”的值(确保您在 settings.py 文件中设置了这些常量)。
函数FileSystemStorage.save 接受 3 个参数;名称、内容(文件本身)和 max_length(默认值 = 无)。
此函数以名称“name”存储文件-“content”。如果存在同名文件,则稍微修改文件名以生成唯一名称。
在 django 文档中阅读有关 FileSystemStorage 类的更多构造函数参数和方法 - 第 3 步:如果尚未定义,则定义 MEDIA_ROOT 和 MEDIA_URL。
设置
确保在 settings.py 中配置了 MEDIA_ROOT 和 MEDIA_URL。
Python3
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # media directory in the root directory
MEDIA_URL = '/media/'
- 第 4 步:最后,我们添加到 MEDIA_URL 的路由。
网址
在 urls.py 中,导入
from django.conf.urls.static import static
from django.conf import settings
- 并在文件末尾添加以下内容
Python3
# only in development
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
- 当用户向 MEDIA_URL/(文件名)发出 GET 请求时,这将添加一条到 MEDIA_URL 的路由并从 MEDIA_ROOT 提供文件。完成所有这些后,上传的文件应显示在 MEDIA_ROOT 常量中指定的目录中。
输出 -
前端应该是这样的
如前所述,此方法应仅用于在开发中而不是在生产中为媒体提供服务。您可能想在生产中使用 nginx 之类的东西。