Как использовать Python / CGI для загрузки файлов - PullRequest
6 голосов
/ 03 февраля 2011

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

На данный момент мне удалось создать простую HTML-страницу, которая может вызывать мой скрипт на python.Затем скрипт python получит файл и загрузит его в виде 1000-байтовых блоков.

У меня есть две основные проблемы (в основном из-за того, что они совершенно новы):

1) Я не могу получитьразмер файла для расчета в процентах 2) Я не знаю, как связаться между Python на стороне сервера и тем, что находится на странице, чтобы обновить статус прогресса, предположительно javascript.

Я все делаю неправильно?Или есть решение моих проблем?

Вот мой код Python:

#!/usr/local/bin/python2.5 
import cgi, os
import cgitb; cgitb.enable()

try:
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) 
    msvcrt.setmode (1, os.O_BINARY) 

except ImportError:
    pass

form = cgi.FieldStorage()
upload = form['file']

if upload.filename:
    name = os.path.basename(upload.filename)
    out = open('/home/oetzi/webapps/py/' + name, 'wb', 1000)
    message = "The file '" + name + "' was uploaded successfully"

    while True:
        packet = upload.file.read(1000)
        if not packet:
            break
        out.write(packet)
    out.close()
else:

message = "Derp... could you try that again please?"

print """\
Content-Type: text/html\n
<html><body>
<p>%s</p>
</body></html>
""" % (message,)

1 Ответ

6 голосов
/ 04 февраля 2011

Это сложнее, чем кажется, учитывая, как загрузка файлов работает по протоколу HTTP. Большинство веб-серверов передают управление сценарию CGI только после полной передачи загруженного файла, поэтому пока нет возможности дать отзыв.

Однако некоторые библиотеки Python пытаются решить эту проблему. Например: gp.fileupload (работает с WSGI, а не с CGI).

Хитрость заключается в том, чтобы предоставить способ запрашивать ход загрузки через AJAX, все еще передавая загруженный файл. Это бесполезно, если веб-сервер (например, Apache или nginx) не настроен для поддержки функции прогресса загрузки, поскольку вы, вероятно, увидите скачок от 0% до 100%.

Я предлагаю вам попробовать Plupload , который работает на стороне клиента и намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...