{"title":"ファイルのアップロード","version":"3.1","locale":"ja","docname":"topics/http/file-uploads","url":"/ja/3.1/topics/http/file-uploads/","canonical":"https://djangodocs.dev/ja/3.1/topics/http/file-uploads/","summary":"Django がファイルアップロードを扱うとき、ファイルデータは request.FILES に格納されます ( request についての詳細は request and response objects…","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/3.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> に格納されます (<code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> についての詳細は <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/\"><span class=\"doc\">request and response objects</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/3.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>Consider a form containing a <a class=\"reference internal\" href=\"/ja/3.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">forms.py</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=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UploadFileForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">file</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">()</span>\n</code></pre></figure>\n<p>このフォームをハンドリングするビューは、ファイルのデータを <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> というディクショナリの中に受け取ります。このディクショナリには、キーと、それぞれのキーに対応するフォームの <a class=\"reference internal\" href=\"/ja/3.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> (または <a class=\"reference internal\" href=\"/ja/3.1/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a> または他の <a class=\"reference internal\" href=\"/ja/3.1/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> のサブクラス) が格納されています。そのため、上のフォームから送信されたデータには、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES['file']</span></code> でアクセスすることができます。</p>\n<p>Note that <a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> will only\ncontain data if the request method was <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code>, at least one file field was\nactually posted, and the <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;form&gt;</span></code> that posted the request has the attribute\n<code class=\"docutils literal notranslate\"><span class=\"pre\">enctype=&quot;multipart/form-data&quot;</span></code>. Otherwise, <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> will be empty.</p>\n<p>Most of the time, you'll pass the file data from <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> into the form as\ndescribed in <a class=\"reference internal\" href=\"/ja/3.1/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Binding uploaded files to a form</span></a>. This would look something like:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">views.py</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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UploadFileForm</span>\n\n<span class=\"c1\"># Imaginary function to handle an uploaded file.</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">somewhere</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">handle_uploaded_file</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">handle_uploaded_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">])</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/url/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;upload.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></figure>\n<p>ここで、<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></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=\"w\"> </span><span class=\"nf\">handle_uploaded_file</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&#39;some/file/name.txt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;wb+&#39;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">destination</span><span class=\"p\">:</span>\n        <span class=\"k\">for</span> <span class=\"n\">chunk</span> <span class=\"ow\">in</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">chunks</span><span class=\"p\">():</span>\n            <span class=\"n\">destination</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">chunk</span><span class=\"p\">)</span>\n</code></pre></div>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">read()</span></code> を使う代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile.chunks()</span></code> でループすることで、大きなサイズのファイルがアップロードされた時にメモリが専有されることを防げます。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code> オブジェクトには、他にもいくつかのメソッドと属性があります。完全なリファレンスについては、<a class=\"reference internal\" href=\"/ja/3.1/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile\" title=\"django.core.files.uploadedfile.UploadedFile\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></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/3.1/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> を持つ <a class=\"reference internal\" href=\"/ja/3.1/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> 上のファイルを保存するときは、<a class=\"reference internal\" href=\"/ja/3.1/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a> を使えば、このプロセスはとても簡単になります。この場合、ファイルオブジェクトは、<code class=\"docutils literal notranslate\"><span class=\"pre\">form.save()</span></code> を呼び出すだけで、対応する <a class=\"reference internal\" href=\"/ja/3.1/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> の <a class=\"reference internal\" href=\"/ja/3.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\"><span class=\"pre\">upload_to</span></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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelFormWithFileField</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ModelFormWithFileField</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"c1\"># file is saved</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/url/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ModelFormWithFileField</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;upload.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>If you are constructing an object manually, you can assign the file object from\n<a class=\"reference internal\" href=\"/ja/3.1/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> to the file field in the\nmodel:</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=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UploadFileForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelWithFileField</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">instance</span> <span class=\"o\">=</span> <span class=\"n\">ModelWithFileField</span><span class=\"p\">(</span><span class=\"n\">file_field</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">])</span>\n            <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/url/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;upload.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></div>\n</section>\n<section id=\"uploading-multiple-files\">\n<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\"><span class=\"pre\">multiple</span></code> HTML 属性をセットしてください:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">forms.py</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=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FileFieldForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">file_field</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ClearableFileInput</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;multiple&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}))</span>\n</code></pre></figure>\n<p>そして、複数のファイルアップロードを扱うために、あなたの <a class=\"reference internal\" href=\"/ja/3.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\"><span class=\"pre\">FormView</span></code></a> サブクラスの <code class=\"docutils literal notranslate\"><span class=\"pre\">post</span></code> メソッドをオーバーライドします:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">views.py</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=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FormView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FileFieldForm</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FileFieldView</span><span class=\"p\">(</span><span class=\"n\">FormView</span><span class=\"p\">):</span>\n    <span class=\"n\">form_class</span> <span class=\"o\">=</span> <span class=\"n\">FileFieldForm</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;upload.html&#39;</span>  <span class=\"c1\"># Replace with your template.</span>\n    <span class=\"n\">success_url</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;...&#39;</span>  <span class=\"c1\"># Replace with your URL or reverse().</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">post</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">form_class</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_form_class</span><span class=\"p\">()</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_form</span><span class=\"p\">(</span><span class=\"n\">form_class</span><span class=\"p\">)</span>\n        <span class=\"n\">files</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"o\">.</span><span class=\"n\">getlist</span><span class=\"p\">(</span><span class=\"s1\">&#39;file_field&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">files</span><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=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">form_valid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">form_invalid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n</section>\n<section id=\"upload-handlers\">\n<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/3.1/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_HANDLERS</span></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><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</code></pre></div>\n<p><a class=\"reference internal\" href=\"/ja/3.1/ref/files/uploads/#django.core.files.uploadhandler.MemoryFileUploadHandler\" title=\"django.core.files.uploadhandler.MemoryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MemoryFileUploadHandler</span></code></a> と <a class=\"reference internal\" href=\"/ja/3.1/ref/files/uploads/#django.core.files.uploadhandler.TemporaryFileUploadHandler\" title=\"django.core.files.uploadhandler.TemporaryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemporaryFileUploadHandler</span></code></a> はともに、Django でファイルがアップロードされた時のデフォルトの動作――小さなファイルはメモリ上に保存し、大きなファイルはディスクに保存する――を提供しています。</p>\n<p>カスタマイズハンドラを書けば、Django がファイルをハンドリングする方法をカスタマイズすることができます。たとえば、カスタムハンドラを使うことで、ユーザレベルでのクオータを設定したり、データをその場で圧縮したり、プログレスバーを表示したり、あるいは、送られたデータをローカルに保存せずに、別のストレージに転送することさえ可能です。ハンドラをカスタマイズしたり、アップロード時の動作を完全に置き換えたりする方法については、詳しくは <a class=\"reference internal\" href=\"/ja/3.1/ref/files/uploads/#custom-upload-handlers\"><span class=\"std std-ref\">アップロードハンドラをカスタマイズする</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\"><span class=\"pre\">/tmp/tmpzfp6I6.upload</span></code> のようなファイルを作成すると考えて良いです。アップロードされたファイルが十分大きければ、Django がデータストリームをディスクに書き込むにつれ、このファイルのサイズが大きくなってゆくのを観察することができるでしょう。</p>\n<p>These specifics -- 2.5 megabytes; <code class=\"docutils literal notranslate\"><span class=\"pre\">/tmp</span></code>; etc. -- are &quot;reasonable defaults&quot;\nwhich can be customized as described in the next section.</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/3.1/ref/settings/#file-upload-settings\"><span class=\"std std-ref\">File Upload Settings</span></a> を参照してください。</p>\n</section>\n<section id=\"modifying-upload-handlers-on-the-fly\">\n<span id=\"id1\"></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\"><span class=\"pre\">request.upload_handlers</span></code> を修正することで、1リクエストごとに、アップロードハンドラをオーバーライドすることが可能です。デフォルトでは、このリストには <a class=\"reference internal\" href=\"/ja/3.1/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_HANDLERS</span></code></a> の設定で指定したアップロードハンドラが入っていますが、このリストは自由に修正することができます。</p>\n<p>たとえば、アップロードの進行状況を計算して、AJAX のウィジェットなどにフィードバックを返す <code class=\"docutils literal notranslate\"><span class=\"pre\">ProgressBarUploadHandler</span></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=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">upload_handlers</span><span class=\"o\">.</span><span class=\"n\">insert</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">ProgressBarUploadHandler</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>この場合には、<code class=\"docutils literal notranslate\"><span class=\"pre\">list.append()</span></code> メソッドの代わりに <code class=\"docutils literal notranslate\"><span class=\"pre\">list.insert()</span></code> を使ったほうが良いでしょう。なぜなら、プログレスバーハンドラーは、他のハンドラの <em>前に</em> 実行する必要があるでしょうから。アップロードハンドラは、リストの前から順に処理されることに注意してください。</p>\n<p>If you want to replace the upload handlers completely, you can assign a new\nlist:</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=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">upload_handlers</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ProgressBarUploadHandler</span><span class=\"p\">(</span><span class=\"n\">request</span><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\"><span class=\"pre\">request.POST</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> にアクセスする <em>前に</em> のみ修正できます。処理が始まってからアップロードハンドラを修正しても無意味だからです。もし <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code> や <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> を読み込んだ後に <code class=\"docutils literal notranslate\"><span class=\"pre\">request.upload_handlers</span></code> を修正しようとしたならば、Django はエラーを投げます。</p>\n<p>したがって、アップロードハンドラの修正は、常にビューのできるだけ早い段階で行うようにするべきです。</p>\n<p>さらに、<code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code> は、デフォルトで有効になっている <a class=\"reference internal\" href=\"/ja/3.1/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CsrfViewMiddleware</span></code></a> によってアクセスされます。つまり、アップロードハンドラを変更できるようにするためには、ビュー上で <a class=\"reference internal\" href=\"/ja/3.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\"><span class=\"pre\">csrf_exempt()</span></code></a> を使う必要があります。それから、実際にそのリクエストを処理する関数上で、<a class=\"reference internal\" href=\"/ja/3.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\"><span class=\"pre\">csrf_protect()</span></code></a> を使う必要があります。ハンドラは、CSRF チェックが終わる前にファイルアップロードの受け取りを開始する可能性があることに注意してください。以下はコードの例です:</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=\"w\"> </span><span class=\"nn\">django.views.decorators.csrf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">csrf_exempt</span><span class=\"p\">,</span> <span class=\"n\">csrf_protect</span>\n\n<span class=\"nd\">@csrf_exempt</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">upload_handlers</span><span class=\"o\">.</span><span class=\"n\">insert</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">ProgressBarUploadHandler</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">_upload_file_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@csrf_protect</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_upload_file_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span> <span class=\"c1\"># Process request</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/3.1/topics/"},{"docname":"topics/http/index","title":"HTTP リクエストのハンドリング","url":"/ja/3.1/topics/http/"}],"prev":{"docname":"topics/http/decorators","title":"View decorators","url":"/ja/3.1/topics/http/decorators/"},"next":{"docname":"topics/http/shortcuts","title":"Django のショートカット関数","url":"/ja/3.1/topics/http/shortcuts/"},"formats":{"html":"/ja/3.1/topics/http/file-uploads/","markdown":"/ja/3.1/topics/http/file-uploads.md","json":"/ja/3.1/topics/http/file-uploads.json"},"source":"https://github.com/django/django/blob/stable/3.1.x/docs/topics/http/file-uploads.txt","official":"https://docs.djangoproject.com/ja/3.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","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}