📜  Django – 使用 FileSystemStorage 上传文件

📅  最后修改于: 2022-05-13 01:54:20.699000             🧑  作者: Mango

Django – 使用 FileSystemStorage 上传文件

Django 附带了 FileSystemStorage 类,该类有助于在本地存储文件,以便这些文件可以在开发中用作媒体。在本文中,我们将看到如何使用 FileSystemStorage API 实现文件上传系统,将文件存储在本地。
注意:此方法只能用于开发,不能用于生产。

如何使用 FileSystemStorage 上传文件?

  • 第 1 步:我们将首先制作一个模板表单来上传文件。
    模板
HTML
          {% csrf_token %}           {{new_form.as_p}}                         



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 之类的东西。