3

単純なPythonサーバーで実行されているPythonスクリプトにHTMLフォームを投稿します。1つのPOSTリクエスト内に最大10個のファイルが投稿されます。画像データには次のようにアクセスします。

import cgi
# simple post data access
form = cgi.FieldStorage()
imgfieldname = "image1"
imagedata = form[imgfieldname].file.read()

# size varies for the same source image file for different uploads
# on Win7 for no obvious reason
size = len(imagedata)

# save image data to file, results in an truncated image on Win7
# as the image is already truncated when read from form above
fh = open("image1", "wb")
fh.write(imagedata)
fh.close()

上記のコードは、MacOS10.8のPython3.2.3で正常に機能します。Win7のPython3.2.3ではランダムエラーが発生します。ファイルのアップロードはランダムに完了しません。完全なファイルがアップロードされることもあれば、切り捨てられたファイルが表示されることもあります。

データを投稿するHTMLフォームは次のようになります。

<form action="/cgi-bin/save.py" method="post" name="Formular" id="Formular"  enctype="multipart/form-data">
<input type="file" formenctype="multipart/form-data" name="image1"/>
<input type="file" formenctype="multipart/form-data" name="image2"/>
<input type="file" formenctype="multipart/form-data" name="image3"/>
<input type="file" formenctype="multipart/form-data" name="image4"/>
<input type="file" formenctype="multipart/form-data" name="image5"/>
<input type="submit" value="save" />
</form>

誰かがこれがWin7で起こる理由を知っていますか?

編集

スクリプトを実行するPythonサーバーは次のようになります

#!/usr/bin/env python
#-*- coding: ISO-8859-1 -*-

import http.server
import socketserver
import subprocess
import os
import time
import threading

import cgi
import cgitb; cgitb.enable()

try: # Windows needs stdio set for binary mode.
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode (1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

PORT = 8000

class MyHandler(http.server.CGIHTTPRequestHandler):

    # Disable logging DNS lookups
    def address_string(self):
        return str(self.client_address[0])


class ThreadingHTTPServer(socketserver.ThreadingMixIn, http.server.HTTPServer):
    pass

if __name__=='__main__':

    #Handler = http.server.CGIHTTPRequestHandler
    Handler = MyHandler

    #httpd = http.server.HTTPServer(("", PORT), Handler)
    httpd = ThreadingHTTPServer(('localhost', 8000), Handler)

    print("serving at port", PORT)
    httpd.serve_forever()
4

1 に答える 1

1
try: # Windows needs stdio set for binary mode.
    import msvcrt
    msvcrt.setmode (0, os.O_BINARY) # stdin  = 0
    msvcrt.setmode (1, os.O_BINARY) # stdout = 1
except ImportError:
    pass

このページから:http ://webpython.codepoint.net/cgi_file_upload

于 2012-09-27T17:26:44.567 に答える