Django – 使用FileSystemStorage上传文件
Django提供了FileSystemStorage类,该类有助于在本地存储文件,以便在开发中把这些文件作为媒体提供。在这篇文章中,我们将看到如何使用FileSystemStorage API实现一个文件上传系统,将文件存储在本地。
注意:这种方法只能在开发中使用,不能在生产中使用。
如何使用FileSystemStorage上传文件?
- 第1步:我们将首先制作一个模板表格来上传文件。
Template
<form method = 'POST' class="col s12" enctype="multipart/form-data">
{% csrf_token %}
{{new_form.as_p}}
<!--Below is our main file upload input -->
<input type = "file" name = 'document'>
<p><button type = "submit" class = "waves-effect waves-light btn" style = "background-color: teal">Publish</button></p>
</form>
- 在这里,请注意输入(用户可以通过它输入一个文件)的名称是 “document”。
-
第2步:现在,我们将在
views.py
文件中编写相同的视图。
View
首先,在文件的顶部用以下方法导入FileSystemStorage类
from django.core.files.storage import FileSystemStorage
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(默认值=无)。
这个函数将文件–‘content’存储在’name’的名称下。如果存在一个同名的文件,那么它就对文件名进行一些修改,以产生一个独特的名字。
在django文档中阅读更多关于FileSystemStorage类的构造参数和方法。 -
第3步:定义MEDIA_ROOT和MEDIA_URL,如果尚未定义。
Settings
确保你在settings.py中配置了MEDIA_ROOT和MEDIA_URL。
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') # media directory in the root directory
MEDIA_URL = '/media/'
- 第4步:最后,我们为MEDIA_URL添加一个路由。
URLs
在urls.py中,导入
from django.conf.urls.static import static
from django.conf import settings
- 并在文件的末尾添加以下内容
# only in development
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
- 这将为MEDIA_URL添加一个路由,当用户向MEDIA_URL/(文件名)发出GET请求时,从MEDIA_ROOT提供文件。一旦完成这一切,上传的文件应该显示在MEDIA_ROOT常量中指定的目录中。
输出 –
前台看起来应该是这样的
如前所述,这种方法只能用于开发中的媒体服务,不能用于生产。你可能想在生产中使用类似nginx的东西。