Home

Tags

FieldStorage получить имя временного файла

2010-11-27 python web fieldstorage bottle

Для этого можно наследовать FieldStorage, и использовать нашу версию класса:

import cgi
class MyFieldStorage(cgi.FieldStorage):
    def make_file(self, binary=None):
        from os import tmpnam
        self.tmp_name = tmpnam()
        return open(self.tmp_name,'w+b')
имя файла будет в field.tmp_name, где field - это экземпляр класса FieldStorage

Если веб фреймворк не позволяет подменить FieldStorage

Тогда подменяем в классе "файла" функцию создания файла (пример использования для фреймворка bottle):
# подменяем make_file
def make_file(self, binary=None):
    from os import tmpnam
    self.tmp_name = tmpnam()
    return open(self.tmp_name,'w+b')
import cgi
cgi.FieldStorage.make_file = make_file

# пример загрузки файла
def query_post_upload():
    fdata = request.POST['file']
    fdata.file.close()
    full_fname = './uploads/' + fdata.filename
    tmp_name = fdata.tmp_name
    os.rename(tmp_name, full_fname)


Таким образом мы избегаем лишнего копирования загружаемого файла, переместив его.