簡體   English   中英

只需將文件保存到Django中的文件夾即可

[英]Simply save file to folder in Django

我有一段代碼通過POST從表單中獲取文件。

file = request.FILES['f']

將此文件保存到我的媒體文件夾的最簡單方法是什么?

settings.MEDIA_ROOT

我正在看這個答案 ,但其中有錯誤引用了未定義的名稱和無效的“塊”方法。

必須有一個簡單的方法來做到這一點?

我的views.py中的EDIT上傳方法:

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()

使用default_storageFileSystemStorage更好。

您可以使用FileSystemStorage將文件保存到MEDIA_ROOT ,但是當您將來更改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)

你可以上傳文件到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')

你可以使用django FileField ,它支持指定upload_to參數,如下所示:

data_file = models.FileField(upload_to=content_path)

其中content_path可以是字符串或返回字符串的函數。

使用以下代碼更新FileFieldImageField 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM