2011-07-22 12 views
9

標準のDjango FileFieldとtempfile.TemporaryFileに問題があります。私がTemporaryFileでFileFieldを保存しようとすると、「ファイルのサイズを特定できません」というエラーが表示されます。例えばDjango "ファイルのサイズを特定できません" tempfile.TemporaryFileでエラーが発生しました

、モデルという名前のモデル、FileFieldに名付けFileFieldに、および一時ファイルの名前temporaryfile与えられた:

Model.FileField.save('foobar', django.core.files.File(TempFile), save=True) 

これは私に上記のエラーになります。何かご意見は?

+0

エラータイプとは何ですか? –

+0

@johnこれはAttributeErrorです。 – Conan

答えて

2

私は同じ問題を抱えていて、私の場合はそれを解決することができました。これは、Djangoは、ファイルのサイズを決定するために使用するコードです:ファイルがディスク上に存在する(またはすでに定義されているサイズの属性を持って)いない場合

 

def _get_size(self): 
    if not hasattr(self, '_size'): 
    if hasattr(self.file, 'size'): 
     self._size = self.file.size 
    elif os.path.exists(self.file.name): 
     self._size = os.path.getsize(self.file.name) 
    else: 
     raise AttributeError("Unable to determine the file's size.") 
    return self._size 
 

そのため、DjangoはAttributeErrorが発生します。 TemporaryFileクラスは、実際にディスクではなくメモリにファイルを作成しようとするため、この_get_sizeメソッドは機能しません。あなたが作成している一時ファイルのサイズを計算することができれば、あなたはsize属性を設定することができ、

 

import tempfile, os 
# Use tempfile.mkstemp, since it will actually create the file on disk. 
(temp_filedescriptor, temp_filepath) = tempfile.mkstemp() 
# Close the open file using the file descriptor, since file objects 
# returned by os.fdopen don't work, either 
os.close(temp_filedescriptor) 

# Open the file on disk 
temp_file = open(temp_filepath, "w+b") 

# Do operations on your file here . . . 

modelObj.fileField.save("filename.txt", File(temp_file)) 

temp_file.close() 
# Remove the created file from disk. 
os.remove(temp_filepath) 
 
また

(および好ましくは):それは仕事を得るために、私はこのような何かをしなければなりませんでしたTemporaryFileオブジェクトに直接私が使用していた図書館のおかげで、これは私の可能性ではありませんでした。

11

tempfile.TemporaryFileでこの問題が発生しました。私がtempfile.NamedTemporaryFileに切り替わったら、それはなくなった。私はTemporaryFileが(少なくともいくつかのオペレーティングシステムでは)ファイルであることをシミュレートしていると信じていますが、NamedTemporaryFileは本当にファイルです。

2

私もtempfile.NamedTemporaryFileHerokuのにこの問題を持っていたし、非常に失望した...

私は(はい、汚い、しかし、私のために働く)を手動で任意のサイズを設定することで、スティーブンのヒントを使用して、それを解く:

from django.core.files import File 
from django.core.files.temp import NamedTemporaryFile 

img_temp = NamedTemporaryFile() 
# Do your stuffs ... 
img_temp.flush() 
img_temp.size = 1024 

media.thumbnail.save('dummy', File(img_temp)) 

ありがとうございました!

関連する問題