2

django アプリにフォームがあります。ユーザーは、フォームを送信する前にファイルを事前にアップロードできます。アップロードされたファイルのハンドラーでは、TemporaryUploadedFile を使用します。つまり、ファイルは /tmp ディレクトリに保存されます。このハンドラーは、ファイル パスとファイル拡張子を含むフォーム - JSON オブジェクトに応答を送信します。この情報は配列に収集されます。

フォームを送信した後、この配列はシリアル化されます。ここに問題があります。フォーム ハンドラがフォーム データとファイル名の配列を受け取り、このファイルにアクセスしようとすると、「そのようなファイルはありません」というエラーが表示されます。

だから、私の質問は - どうすればこの問題を解決できますか? このファイルの寿命をもっと長く設定できるでしょうか?または、TemporaryUploadedFile の代わりに UploadedFile を使用する必要があります。

ティア!

4

1 に答える 1

4

TemporaryUploadedFileを使用しtempfile.NamedTemporaryFileます。Pythonのドキュメントには、次のように書かれています:

tempfile.NamedTemporaryFile([mode='w+b'[, bufsize=-1[, suffix=''[, prefix='tmp'[, dir=None[, delete=True]]]]]])

この関数は、TemporaryFile() とまったく同じように動作しますが、ファイル システムでファイル名が表示されることが保証されている点が異なります (Unix では、ディレクトリ エントリはリンク解除されません)。その名前は、ファイル オブジェクトの name 属性から取得できます。名前付きの一時ファイルがまだ開いている間に、その名前を使用してファイルを 2 度目に開くことができるかどうかは、プラットフォームによって異なります (Unix では使用できますが、Windows NT 以降では使用できません)。delete が true (デフォルト) の場合、ファイルは閉じられるとすぐに削除されます(私のものを強調)。

返されるオブジェクトは常に、ファイル属性が基になる実際のファイル オブジェクトであるファイルのようなオブジェクトです。このファイルのようなオブジェクトは、通常のファイルと同様に with ステートメントで使用できます。

したがって、ここでのデフォルトの動作は、ファイルが閉じられるとすぐにファイルを削除することです。これは、最初の処理の後に自動的に行われます。したがって、2 つの選択肢があります。に渡すことができるようにメソッドをサブクラス化TemporaryUploadedFileしてオーバーライドすることができます(ただし、古い一時ファイルの蓄積を避けるために、完了したらファイルを手動で削除することを忘れないでください)。アップロードの処理から戻る前に別の場所に移動し、代わりに新しい場所を送り返します。__init__delete=Falsetempfile.NamedTemporaryFileTemporaryUploadedFile

UploadedFileそれ自体は基本クラスであり、インスタンス化することを意図していないため、使用するのは適切ではありません。

于 2012-08-06T21:11:20.853 に答える