Flask - Проблемы с отправкой ZIP-папки обратно пользователю - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь отправить файл Excel обратно в браузер пользователя в заархивированной папке.

Я создаю файлы Excel, используя openpyxl , и вот мой код:

@app.route('/test', methods=['GET', 'POST'])
    def test():

        # ...

        from zipfile import ZipFile

        # ...        

        buf = BytesIO()
        wb.save(buf)
        buf.seek(0)

        with ZipFile(buf, 'w') as myzip:
            myzip.write(buf, arcname='test.xlsx')

        return send_file(myzip, attachment_filename='folder.zip', as_attachment=True)

Однако я получаю следующую ошибку:

TypeError: stat: путь должен быть строкой, байтами, os.PathLike или целым числом,не _io.BytesIO

Как я могу сделать это без использования объекта bytesio? или я могу изменить код, чтобы он мог вместить объект bytesio?

большое спасибо заранее.

1 Ответ

0 голосов
/ 12 октября 2019

Попробуйте этот код.

@app.route('/test', methods=['GET', 'POST'])
    def test():

        # ...

        from zipfile import ZipFile

        # ...        

        buf = BytesIO()
        wb.save(buf)
        buf.seek(0)

        filename = 'folder.zip' # assuing zip file u need
        with ZipFile(filename, 'w') as myzip:
            myzip.writestr(zinfo_or_arcname='test.xlsx', bytes=buf.read())

        return send_file(myzip, attachment_filename='folder.zip', as_attachment=True)

Изменения с использованием writestr вместо write

        filename = 'folder.zip' # assuing zip file u need
        with ZipFile(filename, 'w') as myzip:
            myzip.writestr(zinfo_or_arcname='test.xlsx', bytes=buf.read())
...