0

私は Tornado を初めて使用し、単純な複数ファイルのアップロード フォームを作成して、ユーザーが 1 つまたは複数のファイルをアップロードできるようにしようとしています。

これがupload.pyの関連部分です

class UploadHandler(tornado.web.RequestHandler):
    def get(self):
        files_dict = {}
        self.render("upload_form.html", files_dict = files_dict)

    def post(self):

        ofn="" #original file name
        ufn="" #uploaded file name
        files_dict = {} # dict of original:uploaded names

        #file1  
        if self.request.files['file1'][0]: 
                file1 = self.request.files['file1'][0] #infput file
                ofn = file1['filename'] 
                extension = os.path.splitext(ofn)[1]

                if extension in EXT:
                    fname = ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(8))
                    ufn= fname+extension 
                    output_file = open("uploads/" + ufn, 'w')
                    output_file.write(file1['body'])
                    files_dict[ofn]= ufn
                else:
                    files_dict[ofn]= None

        #file2      
        if self.request.files['file2'][0]: 
            file2 = self.request.files['file2'][0] #infput file
            ofn = file2['filename'] 
            extension = os.path.splitext(ofn)[1]

            if extension in EXT:
                fname = ''.join(random.choice(string.ascii_lowercase + string.digits) for x in range(8))
                ufn= fname+extension 
                output_file = open("uploads/" + ufn, 'w')
                output_file.write(file1['body'])
                files_dict[ofn]= ufn
            else:
                files_dict[ofn]= None         


        self.render("upload_form.html", files_dict= files_dict )

そして、upload_form.html のフォーム:

 <form enctype="multipart/form-data" action="/upload" method="post" class="center" >
File1 <input type="file" name="file1" /> <br />
File2 <input type="file" name="file2" /> <br />
<input type="submit" value="upload" class="button" /> 
</form>

File1 と File2 の両方が投稿されている場合、これは正常に機能しますが、どちらかが空の場合、次のようなエラーが発生します。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/tornado-3.1.1-py2.7.egg/tornado/web.py", line 1141, in _when_complete
    callback()
  File "/usr/local/lib/python2.7/dist-packages/tornado-3.1.1-py2.7.egg/tornado/web.py", line 1162, in _execute_method
    self._when_complete(method(*self.path_args, **self.path_kwargs),
  File "upload.py", line 41, in post
    if self.request.files['file2'][0]:
KeyError: 'file2'

ファイルの本文が存在するかどうかを確認するために、ブロックを除いて各ファイルアップロードコードを試してみたり、追加の条件を追加したりするなど、さまざまなトリックを試しましたが、すべて無駄でした。ヒントをいただければ幸いです。

4

1 に答える 1

2

KeyKerror辞書にそのようなキーキーがないため、持っています。次のコードを試してください:

test_dict = {"a":"a"}

if test_dict['a']:
    print "test_dict[a] - ok"

if test_dict['b']:
    print "test_dict[b] - ok"

出力:

test_dict[a] - ok
Traceback (most recent call last):
  File "test.py", line 6, in <module>
    if test_dict['b']:
KeyError: 'b'

in辞書にキーを指定したかどうかをテストするために使用します。

def post(self):
    ofn="" #original file name
    ufn="" #uploaded file name
    files_dict = {} # dict of original:uploaded names

    #file1  
    if 'file1' in self.request.files: 
        file1 = self.request.files['file1'][0] #infput file
        # ...

    #file2    
    if 'file2' in self.request.files: 
        file2 = self.request.files['file2'][0] #infput file
        # ...    

    # ...
于 2013-10-07T05:34:27.113 に答える