2017-12-09 20 views
0

画像が私のmedia/logo/フォルダに保存されています。私の見解では、モデルのFileFieldに保存したいと思います。ここで私が何を試みたのですが、エンコーディングエラーが発生します&ファイルを保存しようとするとファイルが壊れてしまいます。パスからFileFieldに画像を保存する方法は?

UnicodeDecodeError: 'charmap' codec can't decode byte ...


views.py:

def save_records(request): 
    new_path = os.path.join(settings.MEDIA_ROOT, 'logo', filename) 
    same_file = File(new_path, filename) 
    Company.objects.create(logo=same_file) 

私はいくつかのトラブル私はFileFieldに、任意のアイデアにnew_pathでファイルを保存することができますどのように理解していますか?

答えて

1

新しいファイルを作成するのではなく、既存のファイルを使用したい場合は、次のようにします。

def save_records(request): 
    c = Company() 
    c.logo.name = 'logo/<filename>' #relative to the media root. 
    c.save() 

そして、あなたは@Roman Miroshnychenkoのソリューションを使用し、その後、新しいファイルに内容をコピーしたい場合は、既存のレコード

old_path = c.logo.path 
c.logo.name = 'logo/<new filename>' #relative to the media root. 
new_path = settings.MEDIA_ROOT + c.logo.name 
os.rename(old_path, new_path) 
c.save() 

のファイル名を変更したい場合。

DjangoのFileFieldは内部的にFileSystemStorageを使用してファイルを格納し、管理します。したがって、その動作を無効にすることができます。これはDjangoが新しいファイルを生成するのではなく、提供されたファイル名を常に使用するようにします。

from django.core.files.storage import FileSystemStorage 

class CustomFileStorage(FileSystemStorage): 

    def get_available_name(self, name): 
     return name # returns the same name 
あなたのモデルで

from app.storage import CustomFileStorage 

fs = CustomFileStorage() 

class Company(models.Model): 
    logo = model.FileField(storage=fs) 
0

the docsFileによると、classは、パス文字列ではなく1番目の引数としてファイルオブジェクトを想定しています。

with open(new_path, 'rb') as fo: 
    same_file = File(fo, filename) 
    Company.objects.create(logo=same_file) 
+0

問題は、ファイルが既に存在していることで、Djangoは新しいものを保存する代わりに、既存のものを取って、新しいファイルを作成し、取らないための方法があります何がすでに存在しますか? – Lindow

関連する問題