2

目的: 金型からファイル、ファイル リストを受け取り、タスクで処理します。しかし、この問題を解決するために、ファイル記述子はタスクに送信するときに閉じられます。それはとても考えられていますか、それとも問題ですか?非同期 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
4

0 に答える 0