Hallo, ich versuche gerade nach einem Beispiel einen lokalen File-Upload per Python-CGI zu implementieren. Der Transfer läuft durch und das Script meldet einen erfolgreichen Upload - nur leider sind die Files (z.B. jpeg-Bilder) danach viel kleiner und lassen sich nicht öffnen. Server:
1 | import http.server |
2 | PORT = 8080 |
3 | handler = http.server.CGIHTTPRequestHandler |
4 | httpd = http.server.HTTPServer(("", PORT), handler) |
5 | print("serving at port", PORT) |
6 | httpd.serve_forever() |
Upload-Form:
1 | <div> |
2 | <form enctype="multipart/form-data" action="cgi-bin/upload.py" method="post"> |
3 | <p>File: <input type="file" name="file"></p> |
4 | <input type="submit" value=" Start Upload "> |
5 | </form> |
6 | <div> |
CGI:
1 | #!C:\Python33\python.exe |
2 | #!/usr/bin/env python |
3 | import cgi, os |
4 | import cgitb; cgitb.enable() |
5 | |
6 | try: # Windows needs stdio set for binary mode. |
7 | import msvcrt |
8 | msvcrt.setmode (0, os.O_BINARY) # stdin = 0 |
9 | msvcrt.setmode (1, os.O_BINARY) # stdout = 1 |
10 | except ImportError: |
11 | pass |
12 | |
13 | form = cgi.FieldStorage() |
14 | |
15 | # A nested FieldStorage instance holds the file |
16 | fileitem = form['file'] |
17 | |
18 | # Test if the file was uploaded |
19 | if fileitem.filename: |
20 | |
21 | # strip leading path from file name to avoid directory traversal attacks |
22 | fn = os.path.basename(fileitem.filename) |
23 | open('files\\' + fn, 'wb').write(fileitem.file.read()) |
24 | message = 'The file "' + fn + '" was uploaded successfully' |
25 | |
26 | else: |
27 | message = 'No file was uploaded' |
28 | |
29 | print("""\ |
30 | Content-Type: text/html\n |
31 | <html><body>
|
32 | <p>%s</p> |
33 | </body></html>
|
34 | """ % (message,)) |
Hat jemand eine Idee?