上载的文件和上载处理程序

上传文件

class UploadedFile[源代码]

在文件上传期间,实际的文件数据存储在 request.FILES .本词典中的每个条目都是 UploadedFile 对象(或子集)--上传文件的包装器。您通常会使用以下方法之一来访问上传的内容:

UploadedFile.read()

从文件中读取整个上载数据。注意这个方法:如果上传的文件很大,如果你试图把它读到内存中,它会压倒你的系统。你可能想用 chunks() 相反,见下文。

UploadedFile.multiple_chunks(chunk_size=None)

返回 True 如果上载的文件足够大,需要读取多个块。默认情况下,这将是任何大于2.5兆字节的文件,但这是可配置的;请参见下文。

UploadedFile.chunks(chunk_size=None)

返回文件块的生成器。如果 multiple_chunks()True ,应在循环中使用此方法,而不是 read() .

在实践中,它通常最容易使用 chunks() 所有的时间.循环遍历 chunks() 与其使用 read() 确保大文件不会占用系统的内存。

以下是一些有用的属性 UploadedFile

UploadedFile.name

上载文件的名称(例如 my_file.txt

UploadedFile.size

上载文件的大小(以字节为单位)。

UploadedFile.content_type

与文件一起上载的内容类型头(例如 text/plainapplication/pdf )像用户提供的任何数据一样,您不应该相信上载的文件实际上是这种类型。您仍然需要验证文件是否包含内容类型头声明的内容——“信任但验证”。

UploadedFile.content_type_extra

包含传递给 content-type 标头这通常由代表您拦截和处理文件上传的Google App Engine等服务提供。因此,您的处理程序可能不会接收上传的文件内容,而是接收指向该文件的URL或其他指针(请参阅 RFC 2388 )。

UploadedFile.charset

为了 text/* 内容类型、字符集(即 utf8 )由浏览器提供。同样,“信任但验证”是最好的策略。

备注

与常规Python文件一样,您可以通过迭代上传的文件来逐行读取文件::

for line in uploadedfile:
    do_something_with(line)

Lines are split using universal newlines. The following are recognized as ending a line: the Unix end-of-line convention '\n', the Windows convention '\r\n', and the old Macintosh convention '\r'.

亚类 UploadedFile 包括:

class TemporaryUploadedFile[源代码]

上载到临时位置(即流到磁盘)的文件。这个类由 TemporaryFileUploadHandler . 除了方法 UploadedFile ,它还有一个附加方法:

TemporaryUploadedFile.temporary_file_path()[源代码]

返回临时上载文件的完整路径。

class InMemoryUploadedFile[源代码]

上传到内存中的文件(即流到内存)。这个类由 MemoryFileUploadHandler .

内置上载处理程序

一起 MemoryFileUploadHandlerTemporaryFileUploadHandler 提供Django的默认文件上载行为,即将小文件读取到内存中,将大文件读取到磁盘上。它们位于 django.core.files.uploadhandler .

class MemoryFileUploadHandler[源代码]

文件上载处理程序,用于将上载流到内存中(用于小文件)。

class TemporaryFileUploadHandler[源代码]

上载处理程序,该处理程序使用 TemporaryUploadedFile .

正在写入自定义上载处理程序

class FileUploadHandler[源代码]

所有文件上载处理程序都应是 django.core.files.uploadhandler.FileUploadHandler . 您可以在任何需要的地方定义上载处理程序。

所需方法

自定义文件上载处理程序 must 定义以下方法:

FileUploadHandler.receive_data_chunk(raw_data, start)[源代码]

从文件上载接收“数据块”。

raw_data 是包含上载数据的字节字符串。

start 文件中的位置 raw_data 块开始。

您返回的数据将被送入后续的上载处理程序' receive_data_chunk 方法。这样,一个处理程序可以是其他处理程序的“过滤器”。

返回 Nonereceive_data_chunk 从获取此块中短路剩余的上载处理程序。如果您自己存储上载的数据,并且不希望以后的处理程序存储数据的副本,那么这非常有用。

如果你举起 StopUpload 或A SkipFile 异常,将中止上载或完全跳过文件。

FileUploadHandler.file_complete(file_size)[源代码]

当文件完成上载时调用。

处理程序应返回 UploadedFile 将存储在 request.FILES . 处理程序也可能返回 None 以表明 UploadedFile 对象应该来自后续的上载处理程序。

可选方法

自定义上载处理程序还可以定义以下任意可选方法或属性:

FileUploadHandler.chunk_size

“块”django的大小(以字节为单位)应存储到内存中,并馈送到处理程序中。也就是说,该属性控制输入的块的大小 FileUploadHandler.receive_data_chunk .

为了获得最大的性能,块大小应该可以被 4 且不应超过2 GB(231 字节)。当多个处理程序提供多个块大小时,Django将使用任何处理程序定义的最小块大小。

默认值为64*210 字节,或64KB。

FileUploadHandler.new_file(field_name, file_name, content_type, content_length, charset, content_type_extra)[源代码]

发出新文件上载开始的回调信号。在将任何数据输入到任何上载处理程序之前调用此函数。

field_name 是文件的字符串名称 <input> 字段。

file_name 是浏览器提供的文件名。

content_type 是浏览器提供的mime类型——例如 'image/jpeg' .

content_length 是浏览器给定的图像长度。有时不会提供,而且 None .

charset 是字符集(即 utf8 )由浏览器提供。喜欢 content_length ,有时不提供。

content_type_extra 有关该文件的额外信息是否来自 content-type 标题。见 UploadedFile.content_type_extra .

此方法可能会引发 StopFutureHandlers 防止未来处理程序处理此文件的异常。

FileUploadHandler.upload_complete()[源代码]

回调,表示整个上载(所有文件)已完成。

FileUploadHandler.upload_interrupted()[源代码]

回调信号表明上传已中断,例如当用户在文件上传期间关闭浏览器时。

FileUploadHandler.handle_raw_input(input_data, META, content_length, boundary, encoding)[源代码]

允许处理程序完全重写对原始HTTP输入的分析。

input_data 是一个类似文件的对象,它支持 read() -ing。

META 与相同的对象 request.META .

content_length 数据的长度 input_data . 阅读不要超过 content_length 字节从 input_data .

boundary 是此请求的MIME边界。

encoding 是请求的编码。

返回 None 如果要继续上载处理,或 (POST, FILES) 如果您想直接返回适合请求的新数据结构。