Obsługa przesyłania kilku plików

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:

Dodaj komentarz