Как получить путь к файлу с помощью Django?
В настоящее время я использую формы Django для создания FileField
, который позволяет пользователю загрузить файл. Однако после того, как я выбираю файл, создается объект типа django.core.files.uploadedfile.InMemoryUploadedFile
, который является копией исходного файла.
Как мне получить исходный путь к этому файлу, чтобы я мог изменить или заменить его?
# forms.py
class UploadFile(forms.Form):
file = forms.FileField(label="Select File: ", required=True)
# views.py
def get_path(response):
context = {}
if response.method == "POST":
form = UploadFile(response.FILES)
if form.is_valid():
file = form.cleaned_data["file"]
# Is there a way to get the original file path or should I just not use FileField?
print("The File Path Here")
функция temporary_file_path
if form.is_valid():
file = form.cleaned_data["file"]
print(file.temporary_file_path())
Не совсем понятно, почему вы хотите попробовать изменить путь к файлу InMemoryUploadedFile
. Однако, просто помните о термине "InMemory".
Файл еще не был сохранен, поэтому перед сохранением не будет пути, связанного с файлом. Насколько мне известно ( меня поправят, если я ошибаюсь), InMemoryUploadedFile
также не имеют атрибута path, но content/file, filename и т.д.; в которых имя файла может быть изменено. Вы можете посмотреть doc здесь.
При желании вы можете внести изменения в имя файла, сделав следующее:
if form.is_valid():
form.cleaned_data["file"].name = "modify.txt" # or to whatever filename and extension you want.
form.save() # If you have a save method defined
Однако вы можете проявить некоторую изобретательность и сохранить файл по определенному пути в папке media. Например:
# forms.py
import os
from django.conf import settings
class UploadFile(forms.Form):
file = forms.FileField(label="Select File: ", required=True)
# The save method that will save the file to a specific location in the media folder.
def save(self):
filename = file.name
folder = 'uploaded/'
# Create the folder if it doesn't exist.
try:
os.mkdir(os.path.join(settings.MEDIA_ROOT, folder))
except:
pass
# Save the uploaded file inside that folder.
file_path = os.path.join(settings.MEDIA_ROOT, folder, filename)
with open(file_path, 'wb+') as destination:
for chunk in file.chunks():
destination.write(chunk)
# view.py
def get_path(response):
if response.method == "POST":
form = UploadFile(response.FILES)
if form.is_valid():
file = form.cleaned_data["file"]
# file.name = "modify.txt" # Can modify here if necessary...
form.save()