Как я могу выполнить загрузку файлов в twisted.web, которая не будет отстойной?

Я искал и искал, но не могу найти способ загрузить файлы в мое приложение twisted.web любым разумным способом.

В настоящее время публикация файлов, загружаемых на ресурс, приводит к появлению переменной request.args['file'], которая представляет собой список, заполненный содержимым файлов. Я не могу найти способ получить какую-либо информацию о файле: тип пантомимы, имя файла, размер файла (кроме длины строк в args['file'][]) и т. д.

Я читал, что twisted.web2 лучше загружает файлы. Однако я не знаю, насколько это лучше, или как бы я использовал twisted.web2 для обработки загрузки файлов в приложении twisted.web.

Какие-либо предложения? Это беспокоит меня как сумасшедшего - О, и я просмотрел заголовки запросов и не нашел ничего существенного. Как я могу получить дополнительную метаинформацию о загрузке файлов с помощью Twisted?

Также,

Как я могу просто получить простой HTTP-запрос из объекта запроса? Является ли это возможным?


person Carson Myers    schedule 17.07.2010    source источник
comment
На самом деле, я только что узнал о request.content для захвата содержимого запроса. Ни в одной документации, которую я читал, этого не было.   -  person Carson Myers    schedule 17.07.2010
comment
dir() — ваш друг.   -  person Tomasz Wysocki    schedule 17.07.2010


Ответы (2)


Это старый вопрос, но быстрый поиск в stackoverflow не дал сопоставимого вопроса/ответа, поэтому вот краткий пример использования twisted.web2 для загрузки файлов.

Скрытая переменная формы file_foo имеет то же имя, что и переменная загрузки файла, чтобы показать, как Twisted разделит их:

<form action="/upload?a=1&b=2&b=3" enctype="multipart/form-data"
        method="post">
    <input type="hidden" name="foo" value="bar">
    <input type="hidden" name="file_foo" value="not a file">
    file_foo: <input type="file" name="file_foo"><br/>
    file_foo: <input type="file" name="file_foo"><br/>
    file_bar: <input type="file" name="file_bar"><br/>
    <input type="submit" value="submit">
</form>

В вашем методе Resource.render() вот как вы можете получить доступ к переменным формы:

def render(self, ctx):
    request = iweb.IRequest(ctx)
    for key, vals in request.args.iteritems():
        for val in vals:
            print key, val

    print 'file uploads ----------------'
    for key, records in request.files.iteritems():
        print key
        for record in records:
            name, mime, stream = record
            data = stream.read()
            print '   %s %s %s %r' % (name, mime, stream, data)

    return http.Response(stream='upload complete.')

Выход:

         a: 1
         b: 2 3
       foo: bar
  file_foo: not a file

file_bar
   bar.txt MimeType('text', 'plain', {}) <open file '<fdopen>', mode 'w+b' at 0x2158a50> 'bar data.\n\n'
file_foo
   foo.txt MimeType('text', 'plain', {}) <open file '<fdopen>', mode 'w+b' at 0x2158930> 'foo data.\n\n'
   foo.txt MimeType('text', 'plain', {}) <open file '<fdopen>', mode 'w+b' at 0x21589c0> 'foo data.\n\n'
person samplebias    schedule 27.04.2011

Я сделал это так, как описано здесь: решение для загрузки. Решение использует cgi.FieldStorage для анализа полезной нагрузки.

Также: для анализа вам нужно request.content, а не request[args]. Как видите, результаты почти такие же, как и в web2 request.files.

person laidback    schedule 21.03.2012
comment
Также можно использовать fp not value для использования потоков с FieldStorage. скрученный request.files у меня не работал, ни mime, ни имя файла и т. д. - person Sergey; 25.05.2016