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