{"title":"ファイルのアップロード","version":"6.1","locale":"ja","docname":"topics/http/file-uploads","url":"/ja/6.1/topics/http/file-uploads/","canonical":"https://djangodocs.dev/ja/6.1/topics/http/file-uploads/","summary":"Django がファイルアップロードを扱うとき、ファイルデータは request.FILES に格納されます (request についての詳細はリクエスト/レスポンスオブジェクトを参照してく…","html":"<h1>ファイルのアップロード<a class=\"heading-anchor\" href=\"#file-uploads\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Django がファイルアップロードを扱うとき、ファイルデータは <a class=\"reference internal\" href=\"/ja/6.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> に格納されます (<code class=\"docutils literal notranslate\">request</code> についての詳細は <a class=\"reference internal\" href=\"/ja/6.1/ref/request-response/\"><span class=\"doc\">リクエスト/レスポンス オブジェクト</span></a> を参照してください)。ここでは、ファイルがどのようにディスクとメモリに保管され、またどうやってデフォルトの動作を変更するかを説明します。</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>信頼できないユーザーからコンテンツアップロードを許可する場合、セキュリティリスクが存在します！緩和策の詳細は、<a class=\"reference internal\" href=\"/ja/6.1/topics/security/#user-uploaded-content-security\"><span class=\"std std-ref\">ユーザーがアップロードしたコンテンツ</span></a> のセキュリティガイドをご覧ください。</p>\n</aside>\n<section id=\"basic-file-uploads\">\n<h2>ファイルのアップロードの基本<a class=\"heading-anchor\" href=\"#basic-file-uploads\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/ja/6.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> を持つフォームを考えてみましょう:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">forms.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n\n<span class=\"k\">class</span> <span class=\"nc\">UploadFileForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    file <span class=\"o\">=</span> forms<span class=\"o\">.</span>FileField<span class=\"p\">()</span>\n</code></pre></figure>\n<p>このフォームをハンドリングするビューは、ファイルのデータを <a class=\"reference internal\" href=\"/ja/6.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> というディクショナリの中に受け取ります。このディクショナリには、キーと、それぞれのキーに対応するフォームの <a class=\"reference internal\" href=\"/ja/6.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> (または <a class=\"reference internal\" href=\"/ja/6.1/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\">ImageField</code></a> または他の <a class=\"reference internal\" href=\"/ja/6.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> のサブクラス) が格納されています。そのため、上のフォームから送信されたデータには、<code class=\"docutils literal notranslate\">request.FILES['file']</code> でアクセスできます。</p>\n<p>ただし、<a class=\"reference internal\" href=\"/ja/6.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> にデータが格納されるのは、リクエストメソッドが <code class=\"docutils literal notranslate\">POST</code> で、少なくとも1つのファイルフィールドが実際に投稿され、かつリクエストをポストした <code class=\"docutils literal notranslate\">&lt;form&gt;</code> の属性に <code class=\"docutils literal notranslate\">enctype=&quot;multipart/form-data&quot;</code> が設定されていた場合に限られることに注意してください。そうでない場合には、<code class=\"docutils literal notranslate\">request.FILES</code> は空の辞書になります。</p>\n<p>ほとんどの場合、<a class=\"reference internal\" href=\"/ja/6.1/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Binding uploaded files to a form</span></a> で説明されているように、<code class=\"docutils literal notranslate\">request</code> からフォームへデータを引き渡せばよいでしょう。その場合、下記のようになります:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">views.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> UploadFileForm\n\n<span class=\"c1\"># Imaginary function to handle an uploaded file.</span>\n<span class=\"kn\">from</span> <span class=\"nn\">somewhere</span> <span class=\"kn\">import</span> handle_uploaded_file\n\n\n<span class=\"k\">def</span> <span class=\"nf\">upload_file</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            handle_uploaded_file<span class=\"p\">(</span>request<span class=\"o\">.</span>FILES<span class=\"p\">[</span><span class=\"s2\">&quot;file&quot;</span><span class=\"p\">])</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<span class=\"p\">(</span><span class=\"s2\">&quot;/success/url/&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;upload.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;form&quot;</span><span class=\"p\">:</span> form<span class=\"p\">})</span>\n</code></pre></figure>\n<p>ここで、<a class=\"reference internal\" href=\"/ja/6.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> をフォームのコンストラクタに渡す必要があることに注意してください。</p>\n<p>アップロードされたファイルをハンドルする一般的な方法は、次のようになります。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span> <span class=\"nf\">handle_uploaded_file</span><span class=\"p\">(</span>f<span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;some/file/name.txt&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;wb+&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> destination<span class=\"p\">:</span>\n        <span class=\"k\">for</span> chunk <span class=\"ow\">in</span> f<span class=\"o\">.</span>chunks<span class=\"p\">():</span>\n            destination<span class=\"o\">.</span>write<span class=\"p\">(</span>chunk<span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\">read()</code> を使う代わりに <code class=\"docutils literal notranslate\">UploadedFile.chunks()</code> でループすることで、大きなサイズのファイルがアップロードされた時にメモリが専有されることを防げます。</p>\n<p><code class=\"docutils literal notranslate\">UploadedFile</code> オブジェクトには、他にもいくつかのメソッドと属性があります。完全なリファレンスについては、<a class=\"reference internal\" href=\"/ja/6.1/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile\" title=\"django.core.files.uploadedfile.UploadedFile\"><code class=\"xref py py-class docutils literal notranslate\">UploadedFile</code></a> を読んでください。</p>\n<section id=\"handling-uploaded-files-with-a-model\">\n<h3>モデルを使用したアップロードファイルのハンドリング<a class=\"heading-anchor\" href=\"#handling-uploaded-files-with-a-model\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p><a class=\"reference internal\" href=\"/ja/6.1/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> を持つ <a class=\"reference internal\" href=\"/ja/6.1/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a> 上のファイルを保存するときは、<a class=\"reference internal\" href=\"/ja/6.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> を使えば、このプロセスはとても簡単になります。この場合、ファイルオブジェクトは、<code class=\"docutils literal notranslate\">form.save()</code> を呼び出すだけで、対応する <a class=\"reference internal\" href=\"/ja/6.1/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> の <a class=\"reference internal\" href=\"/ja/6.1/ref/models/fields/#django.db.models.FileField.upload_to\" title=\"django.db.models.FileField.upload_to\"><code class=\"xref py py-attr docutils literal notranslate\">upload_to</code></a> 引数で指定した場所に保存されます。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> ModelFormWithFileField\n\n\n<span class=\"k\">def</span> <span class=\"nf\">upload_file</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> ModelFormWithFileField<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            <span class=\"c1\"># file is saved</span>\n            form<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<span class=\"p\">(</span><span class=\"s2\">&quot;/success/url/&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> ModelFormWithFileField<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;upload.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;form&quot;</span><span class=\"p\">:</span> form<span class=\"p\">})</span>\n</code></pre></div>\n<p>手動でオブジェクトを作成する場合には、<a class=\"reference internal\" href=\"/ja/6.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> 内のファイルオブジェクトを、モデルの file_field 引数に指定します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> UploadFileForm\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> ModelWithFileField\n\n\n<span class=\"k\">def</span> <span class=\"nf\">upload_file</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s2\">&quot;POST&quot;</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            instance <span class=\"o\">=</span> ModelWithFileField<span class=\"p\">(</span>file_field<span class=\"o\">=</span>request<span class=\"o\">.</span>FILES<span class=\"p\">[</span><span class=\"s2\">&quot;file&quot;</span><span class=\"p\">])</span>\n            instance<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<span class=\"p\">(</span><span class=\"s2\">&quot;/success/url/&quot;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"s2\">&quot;upload.html&quot;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s2\">&quot;form&quot;</span><span class=\"p\">:</span> form<span class=\"p\">})</span>\n</code></pre></div>\n<p>リクエストの外で手動でオブジェクトを構築する場合は、 <a class=\"reference internal\" href=\"/ja/6.1/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> に <a class=\"reference internal\" href=\"/ja/6.1/ref/files/file/#django.core.files.File\" title=\"django.core.files.File\"><code class=\"xref py py-class docutils literal notranslate\">File</code></a> のようなオブジェクトを代入できます:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.core.management.base</span> <span class=\"kn\">import</span> BaseCommand\n<span class=\"kn\">from</span> <span class=\"nn\">django.core.files.base</span> <span class=\"kn\">import</span> ContentFile\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MyCommand</span><span class=\"p\">(</span>BaseCommand<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">handle</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>options<span class=\"p\">):</span>\n        content_file <span class=\"o\">=</span> ContentFile<span class=\"p\">(</span><span class=\"sa\">b</span><span class=\"s2\">&quot;Hello world!&quot;</span><span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;hello-world.txt&quot;</span><span class=\"p\">)</span>\n        instance <span class=\"o\">=</span> ModelWithFileField<span class=\"p\">(</span>file_field<span class=\"o\">=</span>content_file<span class=\"p\">)</span>\n        instance<span class=\"o\">.</span>save<span class=\"p\">()</span>\n</code></pre></div>\n</section>\n<section id=\"uploading-multiple-files\">\n<span id=\"id1\"></span><h3>複数のファイルをアップロードする<a class=\"heading-anchor\" href=\"#uploading-multiple-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>1つのフォームフィールドを使用して複数のファイルをアップロードしたい場合は、フォームのウィジットのサブクラスを作成し、<code class=\"docutils literal notranslate\">allow_multiple_selected</code> クラス属性を <code class=\"docutils literal notranslate\">True</code> に設定してください。</p>\n<p>このようなファイルをすべてフォームで検証する (そしてフィールドの値にすべてを含める) ためには、 <code class=\"docutils literal notranslate\">FileField</code> をサブクラス化する必要があります。例を以下に示します。</p>\n<aside class=\"admonition-multiple-file-field admonition\" role=\"note\">\n<p class=\"admonition-title\">複数ファイルのフィールド</p>\n<p>Django は将来、適切な複数ファイルフィールドをサポートするようになる予定です。</p>\n</aside>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">forms.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MultipleFileInput</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>ClearableFileInput<span class=\"p\">):</span>\n    allow_multiple_selected <span class=\"o\">=</span> <span class=\"kc\">True</span>\n\n\n<span class=\"k\">class</span> <span class=\"nc\">MultipleFileField</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>FileField<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        kwargs<span class=\"o\">.</span>setdefault<span class=\"p\">(</span><span class=\"s2\">&quot;widget&quot;</span><span class=\"p\">,</span> MultipleFileInput<span class=\"p\">())</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span><span class=\"fm\">__init__</span><span class=\"p\">(</span><span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">clean</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> data<span class=\"p\">,</span> initial<span class=\"o\">=</span><span class=\"kc\">None</span><span class=\"p\">):</span>\n        single_file_clean <span class=\"o\">=</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>clean\n        <span class=\"k\">if</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span>data<span class=\"p\">,</span> <span class=\"p\">(</span><span class=\"nb\">list</span><span class=\"p\">,</span> <span class=\"nb\">tuple</span><span class=\"p\">)):</span>\n            result <span class=\"o\">=</span> <span class=\"p\">[</span>single_file_clean<span class=\"p\">(</span>d<span class=\"p\">,</span> initial<span class=\"p\">)</span> <span class=\"k\">for</span> d <span class=\"ow\">in</span> data<span class=\"p\">]</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            result <span class=\"o\">=</span> <span class=\"p\">[</span>single_file_clean<span class=\"p\">(</span>data<span class=\"p\">,</span> initial<span class=\"p\">)]</span>\n        <span class=\"k\">return</span> result\n\n\n<span class=\"k\">class</span> <span class=\"nc\">FileFieldForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    file_field <span class=\"o\">=</span> MultipleFileField<span class=\"p\">()</span>\n</code></pre></figure>\n<p>そして、複数のアップロードファイルを扱うために、<a class=\"reference internal\" href=\"/ja/6.1/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView\" title=\"django.views.generic.edit.FormView\"><code class=\"xref py py-class docutils literal notranslate\">FormView</code></a> サブクラスの <code class=\"docutils literal notranslate\">form_valid()</code>   メソッドをオーバーライドします。</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\"><code class=\"docutils literal notranslate\">views.py</code></figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Python code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> FormView\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> FileFieldForm\n\n\n<span class=\"k\">class</span> <span class=\"nc\">FileFieldFormView</span><span class=\"p\">(</span>FormView<span class=\"p\">):</span>\n    form_class <span class=\"o\">=</span> FileFieldForm\n    template_name <span class=\"o\">=</span> <span class=\"s2\">&quot;upload.html&quot;</span>  <span class=\"c1\"># Replace with your template.</span>\n    success_url <span class=\"o\">=</span> <span class=\"s2\">&quot;...&quot;</span>  <span class=\"c1\"># Replace with your URL or reverse().</span>\n\n    <span class=\"k\">def</span> <span class=\"nf\">form_valid</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> form<span class=\"p\">):</span>\n        files <span class=\"o\">=</span> form<span class=\"o\">.</span>cleaned_data<span class=\"p\">[</span><span class=\"s2\">&quot;file_field&quot;</span><span class=\"p\">]</span>\n        <span class=\"k\">for</span> f <span class=\"ow\">in</span> files<span class=\"p\">:</span>\n            <span class=\"o\">...</span>  <span class=\"c1\"># Do something with each file.</span>\n        <span class=\"k\">return</span> <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>form_valid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n</code></pre></figure>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">警告</p>\n<p>これにより、フォームレベルでのみ複数のファイルを扱うことができるようになります。例えば、カスタムウィジェットがモデル <code class=\"docutils literal notranslate\">FileField</code> にリレーション先のモデルフィールドで使用されている場合でも、複数のファイルを単一のモデルインスタンス（単一のフィールド）に入れることはできません。</p>\n</aside>\n</section>\n</section>\n<section id=\"upload-handlers\">\n<span id=\"file-upload-handlers\"></span><h2>アップロードハンドラ<a class=\"heading-anchor\" href=\"#upload-handlers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>サイトのユーザがファイルをアップロードした時、Django はそのファイルのデータを <em>アップロードハンドラ (upload handler)</em> という、ファイルがアップロードされた時にデータをハンドリングするための小さなクラスへ渡します。アップロードハンドラは、初めに設定の <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\">FILE_UPLOAD_HANDLERS</code></a> で定義されています。デフォルトでは次のようになっています。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span>\n    <span class=\"s2\">&quot;django.core.files.uploadhandler.MemoryFileUploadHandler&quot;</span><span class=\"p\">,</span>\n    <span class=\"s2\">&quot;django.core.files.uploadhandler.TemporaryFileUploadHandler&quot;</span><span class=\"p\">,</span>\n<span class=\"p\">]</span>\n</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/6.1/ref/files/uploads/#django.core.files.uploadhandler.MemoryFileUploadHandler\" title=\"django.core.files.uploadhandler.MemoryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\">MemoryFileUploadHandler</code></a> と <a class=\"reference internal\" href=\"/ja/6.1/ref/files/uploads/#django.core.files.uploadhandler.TemporaryFileUploadHandler\" title=\"django.core.files.uploadhandler.TemporaryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\">TemporaryFileUploadHandler</code></a> はともに、Django でファイルがアップロードされた時のデフォルトの動作（小さなファイルはメモリ上に保存し、大きなファイルはディスクに保存する）を提供しています。</p>\n<p>カスタマイズハンドラを書けば、Django がファイルをハンドリングする方法をカスタマイズできます。たとえば、カスタムハンドラを使うことで、ユーザレベルでのクオータを設定したり、データをその場で圧縮したり、プログレスバーを表示したり、あるいは、送られたデータをローカルに保存せずに、別のストレージに転送することさえ可能です。ハンドラをカスタマイズしたり、アップロード時の動作を完全に置き換えたりする方法については、詳しくは <a class=\"reference internal\" href=\"/ja/6.1/ref/files/uploads/#custom-upload-handlers\"><span class=\"std std-ref\">Writing custom upload handlers</span></a> を読んでください。</p>\n<section id=\"where-uploaded-data-is-stored\">\n<h3>アップロードされたデータの保存場所<a class=\"heading-anchor\" href=\"#where-uploaded-data-is-stored\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>アップロードされたファイルを保存する時点で、そのデータはコンピュータ上のどこかに保存されているはずです。</p>\n<p>デフォルトでは、アップロードファイルが 2.5 MB 未満ならば、Django はデータ全体をメモリ上に保持します。つまり、この場合にファイルを保存するというのは、メモリ上からデータを読み込んでディスクにファイルを書き込むだけなので、処理は短時間しかかかりません。</p>\n<p>しかし、アップロードファイルのサイズが大きい場合、Django はアップロードファイルをシステムの一時ディレクトリ内に、一時ファイルとして保存します。Unix-like なプラットフォームなら、Django は <code class=\"docutils literal notranslate\">/tmp/tmpzfp6I6.upload</code> のようなファイルを作成すると考えて良いです。アップロードされたファイルが十分大きければ、Django がデータストリームをディスクに書き込むにつれ、このファイルのサイズが大きくなってゆくのを観察することができるでしょう。</p>\n<p>これらの特定の設定（2.5 MB や <code class=\"docutils literal notranslate\">/tmp</code> ディレクトリなど）は、「常識的なデフォルト」として設定されているだけなので、次のセクションで説明するように、自分でカスタマイズできます。</p>\n</section>\n<section id=\"changing-upload-handler-behavior\">\n<h3>アップロードハンドラの動作の変更<a class=\"heading-anchor\" href=\"#changing-upload-handler-behavior\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django のファイルアップロードの動作を制御するための設定がいくつかあります。詳しくは、 <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#file-upload-settings\"><span class=\"std std-ref\">ファイルアップロードの設定</span></a> を参照してください。</p>\n</section>\n<section id=\"modifying-upload-handlers-on-the-fly\">\n<span id=\"id2\"></span><h3>その場でアップロードハンドラを修正する<a class=\"heading-anchor\" href=\"#modifying-upload-handlers-on-the-fly\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>時として特定のビューが異なるアップロード動作を必要とすることがあります。このような場合には、<code class=\"docutils literal notranslate\">request.upload_handlers</code> を修正することで、1リクエストごとに、アップロードハンドラをオーバーライドすることが可能です。デフォルトでは、このリストには <a class=\"reference internal\" href=\"/ja/6.1/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\">FILE_UPLOAD_HANDLERS</code></a> の設定で指定したアップロードハンドラが入っていますが、このリストは自由に修正できます。</p>\n<p>たとえば、アップロードの進行状況を計算して、AJAX のウィジェットなどにフィードバックを返す <code class=\"docutils literal notranslate\">ProgressBarUploadHandler</code> というハンドラを作ったとしましょう。このハンドラを、次のようにアップロードハンドラのリストに追加します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>request<span class=\"o\">.</span>upload_handlers<span class=\"o\">.</span>insert<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">))</span>\n</code></pre></div>\n<p>上記のように <code class=\"docutils literal notranslate\">list.insert()</code> を使用すると、プログレスバーのハンドラーがリストの先頭に配置されることが保証されます。アップロードハンドラーは順番に実行されるため、この配置によりプログレスバーのハンドラーがデフォルトのハンドラーよりも先に実行され、アップロード全体の進行状況を追跡できるようになります。</p>\n<p>アップロードハンドラ全体を置き換えたい場合は、新しいリストを代入します。</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code>request<span class=\"o\">.</span>upload_handlers <span class=\"o\">=</span> <span class=\"p\">[</span>ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">)]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">注釈</p>\n<p>アップロードハンドラは、<code class=\"docutils literal notranslate\">request.POST</code> や <code class=\"docutils literal notranslate\">request.FILES</code> にアクセスする <em>前に</em> のみ修正できます。処理が始まってからアップロードハンドラを修正しても無意味だからです。もし <code class=\"docutils literal notranslate\">request.POST</code> や <code class=\"docutils literal notranslate\">request.FILES</code> を読み込んだ後に <code class=\"docutils literal notranslate\">request.upload_handlers</code> を修正しようとしたならば、Django はエラーを投げます。</p>\n<p>したがって、アップロードハンドラの修正は、常にビューのできるだけ早い段階で行うようにするべきです。</p>\n<p>Also, <code class=\"docutils literal notranslate\">request.POST</code> is accessed by\n<a class=\"reference internal\" href=\"/ja/6.1/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">CsrfViewMiddleware</code></a> which is enabled by\ndefault. This means you will need to use\n<a class=\"reference internal\" href=\"/ja/6.1/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\">csrf_exempt()</code></a> on your view to allow you\nto change the upload handlers. You will then need to use\n<a class=\"reference internal\" href=\"/ja/6.1/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\">csrf_protect()</code></a> on the function that\nactually processes the request. Note that this means that the handlers may\nstart receiving the file upload before the CSRF checks have been done.\nExample code:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.decorators.csrf</span> <span class=\"kn\">import</span> csrf_exempt<span class=\"p\">,</span> csrf_protect\n\n\n<span class=\"nd\">@csrf_exempt</span>\n<span class=\"k\">def</span> <span class=\"nf\">upload_file_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    request<span class=\"o\">.</span>upload_handlers<span class=\"o\">.</span>insert<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">))</span>\n    <span class=\"k\">return</span> _upload_file_view<span class=\"p\">(</span>request<span class=\"p\">)</span>\n\n\n<span class=\"nd\">@csrf_protect</span>\n<span class=\"k\">def</span> <span class=\"nf\">_upload_file_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"c1\"># Process request</span>\n    <span class=\"o\">...</span>\n</code></pre></div>\n<p>クラスベースのビューを使用している場合は、その <a class=\"reference internal\" href=\"/ja/6.1/ref/class-based-views/base/#django.views.generic.base.View.dispatch\" title=\"django.views.generic.base.View.dispatch\"><code class=\"xref py py-meth docutils literal notranslate\">dispatch()</code></a> メソッドで <a class=\"reference internal\" href=\"/ja/6.1/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\">csrf_exempt()</code></a> を使用し、実際にリクエストを処理するメソッドで <a class=\"reference internal\" href=\"/ja/6.1/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\">csrf_protect()</code></a> を使用する必要があります。下記はコード例です:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.utils.decorators</span> <span class=\"kn\">import</span> method_decorator\n<span class=\"kn\">from</span> <span class=\"nn\">django.views</span> <span class=\"kn\">import</span> View\n<span class=\"kn\">from</span> <span class=\"nn\">django.views.decorators.csrf</span> <span class=\"kn\">import</span> csrf_exempt<span class=\"p\">,</span> csrf_protect\n\n\n<span class=\"nd\">@method_decorator</span><span class=\"p\">(</span>csrf_exempt<span class=\"p\">,</span> name<span class=\"o\">=</span><span class=\"s2\">&quot;dispatch&quot;</span><span class=\"p\">)</span>\n<span class=\"k\">class</span> <span class=\"nc\">UploadFileView</span><span class=\"p\">(</span>View<span class=\"p\">):</span>\n    <span class=\"k\">def</span> <span class=\"nf\">setup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        request<span class=\"o\">.</span>upload_handlers<span class=\"o\">.</span>insert<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">))</span>\n        <span class=\"nb\">super</span><span class=\"p\">()</span><span class=\"o\">.</span>setup<span class=\"p\">(</span>request<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">)</span>\n\n    <span class=\"nd\">@method_decorator</span><span class=\"p\">(</span>csrf_protect<span class=\"p\">)</span>\n    <span class=\"k\">def</span> <span class=\"nf\">post</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        <span class=\"c1\"># Process request</span>\n        <span class=\"o\">...</span>\n</code></pre></div>\n</aside>\n</section>\n</section>","rootId":"file-uploads","toc":[{"title":"ファイルのアップロードの基本","anchor":"basic-file-uploads","children":[{"title":"モデルを使用したアップロードファイルのハンドリング","anchor":"handling-uploaded-files-with-a-model","children":[]},{"title":"複数のファイルをアップロードする","anchor":"uploading-multiple-files","children":[]}]},{"title":"アップロードハンドラ","anchor":"upload-handlers","children":[{"title":"アップロードされたデータの保存場所","anchor":"where-uploaded-data-is-stored","children":[]},{"title":"アップロードハンドラの動作の変更","anchor":"changing-upload-handler-behavior","children":[]},{"title":"その場でアップロードハンドラを修正する","anchor":"modifying-upload-handlers-on-the-fly","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Django を使う","url":"/ja/6.1/topics/"},{"docname":"topics/http/index","title":"HTTP リクエストのハンドリング","url":"/ja/6.1/topics/http/"}],"prev":{"docname":"topics/http/decorators","title":"ビューのデコレータ","url":"/ja/6.1/topics/http/decorators/"},"next":{"docname":"topics/http/shortcuts","title":"Django のショートカット関数","url":"/ja/6.1/topics/http/shortcuts/"},"formats":{"html":"/ja/6.1/topics/http/file-uploads/","markdown":"/ja/6.1/topics/http/file-uploads.md","json":"/ja/6.1/topics/http/file-uploads.json"},"source":"https://github.com/django/django/blob/stable/6.1.x/docs/topics/http/file-uploads.txt","official":"https://docs.djangoproject.com/ja/6.1/topics/http/file-uploads/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}