Ostatnio bawiłem się w generowanie stron za pomocą pythona moim celem był mały uploader
Jedno z jego opcji było przesyłanie kilku plików za pomocą tagu input i wprowadzonego w html 5 multiple=”multiple”
kod index.py
#!/usr/bin/env python # -*- coding: utf-8 -*- print "Content-type:text/html\r\n\r\n" print """ <html> <head> <meta http-equiv=\"Content-type\" content=\"text/html; charset=utf-8\" /> </head> <body> <form enctype=\"multipart/form-data\" target=\"frame upload\" method=\"post\" action=\"upload.py\"> <legend>Wybierz jedno lub więcej zdjęć do edycji (maksymalnie 3)</legend> <p>Plik: <input type=\"file\" multiple=\"multiple\" name=\"filename\"/></p> <p><input type=\"submit\" value=\"Upload\" /></p> </form> <iframe name=\"frame upload\" id=\"frame upload\" style=\"display:block\" src=\"\" onload=\"\"></iframe> </body> </html> """
kod upload.py
#!/usr/bin/env python # -*- coding: utf-8 -*- import cgi, os import cgitb; cgitb.enable() form = cgi.FieldStorage() fileitem = form['filename'] print """\ Content-Type: text/html\n <html> <body>"""; message = '' if isinstance(fileitem, list): if len(fileitem) > 3: message += "Za dużo plików (maksymalnie 3)" else: iGood = 0; iBad = 0; for item in fileitem: if item.filename: fn = os.path.basename(item.filename) #open('/home/darkgl/www/skrypty/tmp/' + fn, 'wb').write(item.file.read()) iGood+=1; else: iBad+=1; message += '%d files upload correctly\n %d files upload incorrectly' % (iGood,iBad) else: if fileitem.filename: # strip leading path from file name to avoid # directory traversal attacks fn = os.path.basename(fileitem.filename) #open('/home/darkgl/www/skrypty/tmp/' + fn, 'wb').write(fileitem.file.read()) message += 'The file "' + fn + '" was uploaded successfully %s' % (fileitem) else: message += 'No file upload' print """ <p>%s</p> </body> </html> """ % (message)
funkcje zapisu za komentowałem
open('/home/darkgl/www/skrypty/tmp/' + fn, 'wb').write(fileitem.file.read())
jeśli przesyłamy kilka plików to dostajemy listę
if isinstance(fileitem, list):
jeśli jeden to mamy już tylko 1 obiekt
ustawiłem że maksymalnie można wrzucić 3 pliki
if len(fileitem) > 3: