目的: 金型からファイル、ファイル リストを受け取り、タスクで処理します。しかし、この問題を解決するために、ファイル記述子はタスクに送信するときに閉じられます。それはとても考えられていますか、それとも問題ですか?非同期 aiohttp を使用した JavaScript ファイルによるデュアルブートを処理したくありません。
サーバーサイドカット
@app.post('/files', name="files_post")
async def files_post(request):
# read data file
data = await request.post()
print(data)
# filename for save
filename = data['filename'].filename
# get fd
iofile = data['filename'].file
path = app.static_path + '/{}'.format(filename)
# check work task --> fucken problem?>
app.loop.create_task(app.savefile(filename=filename,iofile=iofile, data=data))
return web.Response(body=b"ffs suxx upload..")
with open(path, "wb") as fout:
while iofile.closed:
buf = iofile.read(buffer_size=1024)
fout.write(buf)
print("File {} success upload".format(filename))
return web.Response(body=content,
headers=MultiDict(
{'Content-Disposition: attachment; filename="{}"'.format(filename): filename}))
html サイドカット
<strong>Upload</strong>
<form method="post" action="/files" enctype="multipart/form-data">
<strong>Choise files: </strong> <input type="file" name="filename" multiple>
<input type="submit" name="sender" value="Send" />
</form>
タスクカット
async def savefile(self, filename, iofile, ptosave=None, data=None):
if isinstance(iofile, io.BufferedRandom):
path = os.path.join((ptosave or self.static_path_upload), filename)
fin = fout = None
print('[TASK] From task:', iofile)
print("[TASK] -->", data['filename'].file.closed)
print("[TASK] --> File upload closed: ", iofile.closed)
try:
iofile.readable().type(iofile)
except ValueError as err:
print("[TASK] readable: {}".format(err))
return
# back
if not iofile.closed:
try:
with open(path,"wb") as fout:
buf=iofile.read(1024) # read 1024 bytes
fout.write(buf) # write buf ~ len(buf) bytes
except IOError as err:
print("SAVENAME: ", err)
finally:
if fout:
fout.close()
print("File {} upload".format(filename))
デバッグ メッセージのカット
[MIDDLEWARE - database] [ Engine creating ] <aiomysql.sa.engine.Engine object at 0x8084790b8>
Method: POST
Path: /files
Cookies: {}
[MIDDLEWARE - database] [ Engine creating ] <aiomysql.sa.engine.Engine object at 0x80848ea90>
<MultiDictProxy('filename': Field(name='filename', filename='8.png', file=<_io.BufferedRandom name=10>, content_type='image/png'), 'sender': 'Send')>
[TASK] From task: <_io.BufferedRandom name=10>
[TASK] --> True
[TASK] --> File upload closed: True
[TASK] readable: I/O operation on closed file