我有一段代码通过POST从表单中获取文件。
file = request.FILES['f']
将此文件保存到
中的媒体文件夹的最简单方法是什么?settings.MEDIA_ROOT
我正在查看this answer等等,但我提到了未定义的名称和无效的" chunks"方法
必须有一种简单的方法吗?
修改 我在views.py中的上传方法:
def upload(request):
folder = request.path.replace("/", "_")
uploaded_filename = request.FILES['f'].name
# 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.
full_filename = os.path.join(settings.MEDIA_ROOT, folder, uploaded_filename)
fout = open(full_filename, 'wb+')
file_content = ContentFile( request.FILES['f'].read() )
# Iterate through the chunks.
for chunk in file_content.chunks():
fout.write(chunk)
fout.close()
答案 0 :(得分:6)
您可以使用django FileField
,它支持指定upload_to
参数,如下所示:
data_file = models.FileField(upload_to=content_path)
其中content_path
可以是字符串或返回字符串的函数。
答案 1 :(得分:4)
您可以将文件上传到django服务器::
from django.shortcuts import render
from django.conf import settings
from django.core.files.storage import FileSystemStorage
def upload(request):
folder='my_folder/'
if request.method == 'POST' and request.FILES['myfile']:
myfile = request.FILES['myfile']
fs = FileSystemStorage(location=folder) #defaults to MEDIA_ROOT
filename = fs.save(myfile.name, myfile)
file_url = fs.url(filename)
return render(request, 'upload.html', {
'file_url': file_url
})
else:
return render(request, 'upload.html')
答案 2 :(得分:4)
使用default_storage
比FileSystemStorage
更好。
您可以使用MEDIA_ROOT
将文件保存到FileSystemStorage
,但是将来在更改DEFAULT_FILE_STORAGE
后端时,此操作可能不再起作用。
如果您使用default_storage
,将来如果您想将aws,azure等用作具有多个Django worker的文件存储,则您的代码可以正常使用。
default_storage用法示例:
from django.core.files.storage import default_storage
# Saving POST'ed file to storage
file = request.FILES['myfile']
file_name = default_storage.save(file.name, file)
# Reading file from storage
file = default_storage.open(file_name)
file_url = default_storage.url(file_name)
答案 3 :(得分:0)
使用以下代码更新FileField
或ImageField
。 Django默认会将文件上传到settings.MEDIA_ROOT
。
from os.path import basename
from django.core.files import File
self.model.file_field.save(basename(path), content=File(open(path, 'rb')))
您可以访问的后缀:
这样的路径:
self.model.file_field.path
这样的网址:
self.model.file_field.url