Используя ответ @hasanatkazmi (используется в приложении Twisted), я получил что-то вроде:
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# -*- indent: 4 spc -*-
import sys
import cgi
import tempfile
class PredictableStorage(cgi.FieldStorage):
def __init__(self, *args, **kwargs):
self.path = kwargs.pop('path', None)
cgi.FieldStorage.__init__(self, *args, **kwargs)
def make_file(self, binary=None):
if not self.path:
file = tempfile.NamedTemporaryFile("w+b", delete=False)
self.path = file.name
return file
return open(self.path, 'w+b')
Имейте в виду, что файл не всегда создается CGI модуль.Согласно этим cgi.py
строкам, он будет создан, только если содержимое превышает 1000 байт:
if self.__file.tell() + len(line) > 1000:
self.file = self.make_file('')
Итак, вам нужно проверить, был ли файл действительно создан с запросом к пользовательскому классу 'path
поле выглядит так:
if file_field.path:
# Using an already created file...
else:
# Creating a temporary named file to store the content.
import tempfile
with tempfile.NamedTemporaryFile("w+b", delete=False) as f:
f.write(file_field.value)
# You can save the 'f.name' field for later usage.
Если для поля также установлено Content-Length
, что, как представляется, редко, файл также должен быть создан с помощью cgi .
Это оно.Таким образом, вы можете хранить файл предсказуемо, уменьшая объем используемой памяти вашего приложения.