{"title":"上传的文件和上传处理程序","version":"5.2","locale":"zh-hans","docname":"ref/files/uploads","url":"/zh-hans/5.2/ref/files/uploads/","canonical":"https://djangodocs.dev/zh-hans/5.2/ref/files/uploads/","summary":"上传的文件 Link to this heading # class UploadedFile Link to this definition # 在文件上传过程中，实际的文件数据存储在 request.FILES 中。这个字典中的每一个条目都是一个 UploadedFile 对象（或一个子类）——…","html":"<span id=\"uploaded-files-and-upload-handlers\"></span><h1>上传的文件和上传处理程序<a class=\"heading-anchor\" href=\"#module-django.core.files.uploadedfile\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<section id=\"uploaded-files\">\n<h2>上传的文件<a class=\"heading-anchor\" href=\"#uploaded-files\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">UploadedFile</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>在文件上传过程中，实际的文件数据存储在 <a class=\"reference internal\" href=\"/zh-hans/5.2/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\">UploadedFile</span></code> 对象（或一个子类）—— 一个所上传文件的包装器。你通常会使用这些方法之一来访问上传的内容：</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.read\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">read</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.read\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>从文件中读取整个上传的数据。小心使用这个方法：如果上传的文件很大，如果你试图把它读到内存中，它可能会让你的系统不堪重负。你可能会想使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunks()</span></code> 来代替；见下文。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.multiple_chunks\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">multiple_chunks</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">chunk_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.multiple_chunks\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>如果上传的文件足够大，需要分块读取，返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>。默认情况下是大于 2.5 兆字节的文件，但这是可以配置的，见下文。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.chunks\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">chunks</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">chunk_size</span></span><span class=\"o\"><span class=\"pre\">=</span></span><span class=\"default_value\"><span class=\"pre\">None</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.chunks\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个生成器，返回文件的块。如果 <code class=\"docutils literal notranslate\"><span class=\"pre\">multiple_chunks()</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">True</span></code>，你应该在循环中使用这个方法而不是 <code class=\"docutils literal notranslate\"><span class=\"pre\">read()</span></code>。</p>\n<p>在实践中，通常最简单的做法是一直使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunks()</span></code>。循环使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">chunks()</span></code> 而不是使用 <code class=\"docutils literal notranslate\"><span class=\"pre\">read()</span></code> 可以确保大文件不会过度占用系统的内存。</p>\n</dd></dl>\n\n<p>以下是 <code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code> 的一些有用属性：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.name\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">name</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.name\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>上传的文件名称（如 <code class=\"docutils literal notranslate\"><span class=\"pre\">my_file.txt</span></code>）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.size\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">size</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.size\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>上传文件的大小，以字节为单位。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.content_type\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">content_type</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.content_type\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>与文件一起上传的内容类型头（例如 <em class=\"mimetype\">text/plain</em> 或 <em class=\"mimetype\">application/pdf</em>）。就像用户提供的任何数据一样，你不应该相信上传的文件实际上是这种类型。你仍然需要验证该文件是否包含内容类型头所声称的内容 —— “信任但验证”。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.content_type_extra\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">content_type_extra</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.content_type_extra\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>包含传递给 <code class=\"docutils literal notranslate\"><span class=\"pre\">content-type</span></code> 头的额外参数的字典。这通常是由服务提供的，比如 Google App Engine，它代表你拦截和处理文件上传。因此，您的处理程序可能不会收到上传的文件内容，而是收到一个 URL 或其他指向文件的指针（参见 <span class=\"target\" id=\"index-4\"></span><a class=\"rfc reference external\" href=\"https://datatracker.ietf.org/doc/html/rfc2388.html#section-5.3\"><strong>RFC 2388</strong></a>）。</p>\n</dd></dl>\n\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.UploadedFile.charset\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">UploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">charset</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.UploadedFile.charset\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>对于 <em class=\"mimetype\">text/*</em> 内容类型，浏览器提供的字符集（即 <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8</span></code>）。同样，“信任但验证” 是这里的最佳政策。</p>\n</dd></dl>\n\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>像普通的 Python 文件一样，你可以通过迭代上传的文件来逐行读取文件：</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\">for</span> <span class=\"n\">line</span> <span class=\"ow\">in</span> <span class=\"n\">uploadedfile</span><span class=\"p\">:</span>\n    <span class=\"n\">do_something_with</span><span class=\"p\">(</span><span class=\"n\">line</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>使用 <span class=\"target\" id=\"index-5\"></span><a class=\"pep reference external\" href=\"https://peps.python.org/pep-0278/\"><strong>通用换行符</strong></a> 来分割行。以下是公认的行结束方式：Unix 的行末约定 <code class=\"docutils literal notranslate\"><span class=\"pre\">'\\n'</span></code>，Windows 的约定 <code class=\"docutils literal notranslate\"><span class=\"pre\">'\\r\\n'</span></code>，以及旧的 Macintosh 约定 <code class=\"docutils literal notranslate\"><span class=\"pre\">'\\r'</span></code>。</p>\n</aside>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code> 的子类包括：</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.TemporaryUploadedFile\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TemporaryUploadedFile</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.TemporaryUploadedFile\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个文件上传到一个临时位置（即传输到磁盘）。这个类被 <a class=\"reference internal\" href=\"#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> 使用。除了 <a class=\"reference internal\" href=\"#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</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.TemporaryUploadedFile.temporary_file_path\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">TemporaryUploadedFile.</span></span><span class=\"sig-name descname\"><span class=\"pre\">temporary_file_path</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.TemporaryUploadedFile.temporary_file_path\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>返回临时上传文件的完整路径。</p>\n</dd></dl>\n\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadedfile.InMemoryUploadedFile\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">InMemoryUploadedFile</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadedfile.InMemoryUploadedFile\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>一个上传到内存中的文件（即传输到内存）。这个类被 <a class=\"reference internal\" href=\"#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> 使用。</p>\n</dd></dl>\n\n</section>\n<section id=\"module-django.core.files.uploadhandler\">\n<span id=\"built-in-upload-handlers\"></span><h2>内置上传处理程序<a class=\"heading-anchor\" href=\"#module-django.core.files.uploadhandler\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"#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=\"#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 默认的文件上传行为，即向内存中读取小文件，向磁盘中读取大文件。它们位于 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.files.uploadhandler</span></code> 中。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.MemoryFileUploadHandler\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">MemoryFileUploadHandler</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.MemoryFileUploadHandler\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>文件上传处理程序，将上传的文件以流式传输到内存中（用于小文件）。</p>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.TemporaryFileUploadHandler\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">TemporaryFileUploadHandler</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.TemporaryFileUploadHandler\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>使用 <code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemporaryUploadedFile</span></code> 将数据流式传输到临时文件的上传处理程序。</p>\n</section>\n<section id=\"writing-custom-upload-handlers\">\n<span id=\"custom-upload-handlers\"></span><h2>编写自定义上传处理程序<a class=\"heading-anchor\" href=\"#writing-custom-upload-handlers\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<dl class=\"py class\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler\">\n<em class=\"property\"><span class=\"k\"><span class=\"pre\">class</span></span><span class=\"w\"> </span></em><span class=\"sig-name descname\"><span class=\"pre\">FileUploadHandler</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd></dd></dl>\n\n<p>所有的文件上传处理程序应该是 <code class=\"docutils literal notranslate\"><span class=\"pre\">django.core.files.uploadhandler.FileUploadHandler</span></code> 的子类。你可以在任何地方定义上传处理程序。</p>\n<section id=\"required-methods\">\n<h3>必要方法<a class=\"heading-anchor\" href=\"#required-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>自定义文件上传处理程序 <strong>必须</strong> 定义以下方法：</p>\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.receive_data_chunk\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">receive_data_chunk</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">raw_data</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">start</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.receive_data_chunk\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>接收文件上传的 “块” 数据。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">raw_data</span></code> 是一个包含上传数据的字节字符串。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">start</span></code> 是文件中 <code class=\"docutils literal notranslate\"><span class=\"pre\">raw_data</span></code> 块开始的位置。</p>\n<p>你返回的数据将被输入到后续的上传处理程序的 <code class=\"docutils literal notranslate\"><span class=\"pre\">receive_data_chunk</span></code> 方法中。通过这种方式，一个处理程序可以成为其他处理程序的 “过滤器”。</p>\n<p>从 <code class=\"docutils literal notranslate\"><span class=\"pre\">receive_data_chunk</span></code> 中返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，以短路剩余的上传处理程序。如果你自己存储上传的数据，并且不希望后续的处理程序存储数据的副本，这很有用。</p>\n<p>如果引发一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">StopUpload</span></code> 或 <code class=\"docutils literal notranslate\"><span class=\"pre\">SkipFile</span></code> 异常，上传将被中止或文件将被完全跳过。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.file_complete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">file_complete</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">file_size</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.file_complete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>当文件上传完毕时调用。</p>\n<p>处理程序应返回一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code> 对象，该对象将存储在 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> 中。处理程序也可以返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code> 以表明 <code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code> 对象应来自后续的上传处理程序。</p>\n</dd></dl>\n\n</section>\n<section id=\"optional-methods\">\n<h3>可选方法<a class=\"heading-anchor\" href=\"#optional-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>自定义上传处理程序也可以定义以下任何一个可选方法或属性：</p>\n<dl class=\"py attribute\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.chunk_size\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">chunk_size</span></span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.chunk_size\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>Django 应该存储到内存中并反馈给处理程序的 “块” 的大小，以字节为单位。也就是说，这个属性控制了输入到 <code class=\"docutils literal notranslate\"><span class=\"pre\">FileUploadHandler.receive_data_chunk</span></code> 的数据块的大小。</p>\n<p>为了获得最大的性能，分块大小应该被 <code class=\"docutils literal notranslate\"><span class=\"pre\">4</span></code> 整除，并且大小不能超过 2GB（2<sup>31</sup> 字节）。当有多个处理程序提供的多个分块大小时，Django 将使用任何处理程序定义的最小分块大小。</p>\n<p>默认为 64*2<sup>10</sup> 字节，即 64KB。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.new_file\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">new_file</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">field_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">file_name</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">content_type</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">content_length</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">charset</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">content_type_extra</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.new_file\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>回调信号，表示一个新的文件上传开始。在任何数据被送入任何上传处理程序之前，这个回调被调用。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">field_name</span></code> 是文件 <code class=\"docutils literal notranslate\"><span class=\"pre\">&lt;input&gt;</span></code> 字段的字符串名称。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">file_name</span></code> 是浏览器提供的文件名。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">content_type</span></code> 是浏览器提供的 MIME 类型 —— 例如 <code class=\"docutils literal notranslate\"><span class=\"pre\">'image/jpeg'</span></code>。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">content_length</span></code> 是浏览器给出的图像长度。有时不会提供，而是 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">charset</span></code> 是浏览器提供的字符集（即 <code class=\"docutils literal notranslate\"><span class=\"pre\">utf8</span></code>）。与 <code class=\"docutils literal notranslate\"><span class=\"pre\">content_length</span></code> 一样，有时不会提供。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">content_type_extra</span></code> 是关于文件的 <code class=\"docutils literal notranslate\"><span class=\"pre\">content-type</span></code> 头的额外信息。参见 <a class=\"reference internal\" href=\"#django.core.files.uploadedfile.UploadedFile.content_type_extra\" title=\"django.core.files.uploadedfile.UploadedFile.content_type_extra\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">UploadedFile.content_type_extra</span></code></a>。</p>\n<p>这个方法可能会引发一个 <code class=\"docutils literal notranslate\"><span class=\"pre\">StopFutureHandlers</span></code> 异常，以防止后续处理程序处理这个文件。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.upload_complete\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">upload_complete</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.upload_complete\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>回调信号，表示整个上传（所有文件）已经完成。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.upload_interrupted\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">upload_interrupted</span></span><span class=\"sig-paren\">(</span><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.upload_interrupted\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>回调信号，表明上传被中断，例如，当用户在文件上传过程中关闭他们的浏览器。</p>\n</dd></dl>\n\n<dl class=\"py method\">\n<dt class=\"sig sig-object py\" id=\"django.core.files.uploadhandler.FileUploadHandler.handle_raw_input\">\n<span class=\"sig-prename descclassname\"><span class=\"pre\">FileUploadHandler.</span></span><span class=\"sig-name descname\"><span class=\"pre\">handle_raw_input</span></span><span class=\"sig-paren\">(</span><em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">input_data</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">META</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">content_length</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">boundary</span></span></em>, <em class=\"sig-param\"><span class=\"n\"><span class=\"pre\">encoding</span></span></em><span class=\"sig-paren\">)</span><a class=\"heading-anchor\" href=\"#django.core.files.uploadhandler.FileUploadHandler.handle_raw_input\"><span class=\"visually-hidden\">Link to this definition</span><span aria-hidden=\"true\">#</span></a></dt>\n<dd><p>允许处理程序完全覆盖原始 HTTP 输入的解析。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">input_data</span></code> 是一个支持 <code class=\"docutils literal notranslate\"><span class=\"pre\">read()</span></code>-ing 的类文件对象。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">META</span></code> 与 <code class=\"docutils literal notranslate\"><span class=\"pre\">request.META</span></code> 是同一个对象。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">content_length</span></code> 是 <code class=\"docutils literal notranslate\"><span class=\"pre\">input_data</span></code> 中数据的长度。不要从 <code class=\"docutils literal notranslate\"><span class=\"pre\">input_data</span></code> 中读取超过 <code class=\"docutils literal notranslate\"><span class=\"pre\">content_length</span></code> 的字节。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">boundary</span></code> 是本次请求的 MIME 边界。</p>\n<p><code class=\"docutils literal notranslate\"><span class=\"pre\">encoding</span></code> 是请求的编码。</p>\n<p>如果想继续上传处理，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">None</span></code>，如果想直接返回适合请求的新数据结构，则返回 <code class=\"docutils literal notranslate\"><span class=\"pre\">(POST，FILES)</span></code> 的元组。</p>\n</dd></dl>\n\n</section>\n</section>","rootId":"module-django.core.files.uploadedfile","toc":[{"title":"上传的文件","anchor":"uploaded-files","children":[]},{"title":"内置上传处理程序","anchor":"module-django.core.files.uploadhandler","children":[]},{"title":"编写自定义上传处理程序","anchor":"writing-custom-upload-handlers","children":[{"title":"必要方法","anchor":"required-methods","children":[]},{"title":"可选方法","anchor":"optional-methods","children":[]}]}],"breadcrumbs":[{"docname":"ref/index","title":"API 参考","url":"/zh-hans/5.2/ref/"},{"docname":"ref/files/index","title":"文件处理","url":"/zh-hans/5.2/ref/files/"}],"prev":{"docname":"ref/files/storage","title":"文件存储 API","url":"/zh-hans/5.2/ref/files/storage/"},"next":{"docname":"ref/forms/index","title":"表单","url":"/zh-hans/5.2/ref/forms/"},"formats":{"html":"/zh-hans/5.2/ref/files/uploads/","markdown":"/zh-hans/5.2/ref/files/uploads.md","json":"/zh-hans/5.2/ref/files/uploads.json"},"source":"https://github.com/django/django/blob/stable/5.2.x/docs/ref/files/uploads.txt","official":"https://docs.djangoproject.com/zh-hans/5.2/ref/files/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"],"inLocales":["en","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}