2011-02-03 9 views
6

Próbuję utworzyć stronę do przesyłania plików, która będzie monitować użytkownika o plik i będzie przesyłana podczas wyświetlania postępu.Jak korzystać z Pythona/CGI do przesyłania plików

W tej chwili udało mi się zrobić prostą stronę HTML, która może wywoływać mój skrypt Pythona. Skrypt Pythona pobierze plik i prześle 1000 bajtów.

Mam dwa główne problemy (głównie ze względu na całkowicie nowy na tym):

1) Nie mogę uzyskać rozmiar pliku, aby obliczyć procent 2) Nie wiem, jak komunikować się między po stronie serwera python i cokolwiek jest na stronie, aby zaktualizować stan postępu, prawdopodobnie javascript.

Czy podchodzę do wszystkiego w niewłaściwy sposób? Czy istnieje rozwiązanie moich problemów?

Oto mój kod 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,) 

Odpowiedz

6

To jest bardziej skomplikowane niż się wydaje, biorąc pod uwagę jak przesyłanie plików działa w protokole HTTP. Większość serwerów internetowych zapewnia kontrolę nad skryptem CGI tylko wtedy, gdy przesłany plik został całkowicie przesłany, więc nie ma możliwości wyrażenia opinii w międzyczasie.

Istnieje kilka bibliotek Pythona, które próbują rozwiązać ten problem. Na przykład: gp.fileupload (działa z WSGI, nie CGI).

Sztuką jest zapewnienie sposobu sprawdzania postępu przesyłania za pośrednictwem AJAX przy jednoczesnym przesyłaniu przesłanego pliku. Nie ma to sensu, jeśli serwer WWW (na przykład Apache lub nginx) nie jest skonfigurowany do obsługi funkcji postępu przesyłania, ponieważ prawdopodobnie zobaczysz przeskok o 0% do 100% na pasku postępu.

Proponuję wypróbować Plupload, która działa po stronie klienta i jest znacznie prostsza.

Powiązane problemy