質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

7911閲覧

Flaskで複数ファイルをダウンロードしたい

hideo3

総合スコア15

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/05/22 06:10

編集2019/05/22 06:13
  • 開発環境

Visual Studio Code:1.34.0
python:3.6.8

①以下の内容で、複数ファイルをダウンロードしようとしています。

html

1<!-- htmlファイル(抜粋) --> 2<form action="/all_download"> 3 <button type="submit">全てダウンロード</button> 4</form>

flask

1# app.py(抜粋) 2@app.route('/all_download') 3def download_all(): 4 dir = 'data' 5 data_files = os.listdir(dir) 6 data_files_fullpath = [os.path.join(dir, d) for d in data_files] 7 for d in data_files_fullpath: 8 print('ダウンロード: ' + d) 9 return send_file(d, as_attachment = True)

bash

1# 「全てダウンロード」ボタンをクリックした際のターミナルの表示 2ダウンロード: /XX/XX/data/aaa.txt 3127.0.0.1 - - [22/May/2019 14:18:04] "GET /all_download HTTP/1.1" 200 -

ファイルを1つダウンロードして終了してしまいます。

②なので、returnを外してみました。

flask

1# app.py(抜粋) 2@app.route('/all_download') 3def download_all(): 4 dir = 'data' 5 data_files = os.listdir(dir) 6 data_files_fullpath = [os.path.join(dir, d) for d in data_files] 7 for d in data_files_fullpath: 8 print('ダウンロード: ' + d) 9 send_file(d, as_attachment = True) # returnを外す 10 return index()

bash

1# 「全てダウンロード」ボタンをクリックした際のターミナルの表示 2ダウンロード: /XX/XX/data/aaa.txt 3ダウンロード: /XX/XX/data/bbb.txt 4ダウンロード: /XX/XX/data/ccc.txt 5127.0.0.1 - - [22/May/2019 14:00:00] "GET /all_download HTTP/1.1" 200 -

for文は繰り返されるのですが、今度は1つもファイルがダウンロードできていませんでした。

for文を抜けることなく、ファイルをダウンロードするにはどのようにすればよいでしょうか。
どなたかわかる方がいましたら、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Flaskのsend_fileで複数ファイルを送る(ダウンロード)させることはできません。
その代わりにFlaskサーバ上で複数ファイルをzipファイルにまとめて圧縮して返す手法を検討してみてはいかがでしょうか。詳細コードは以下が参考になります。
How to send zip files in the python Flask framework?

投稿2019/05/22 06:49

can110

総合スコア38260

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hideo3

2019/05/22 09:53

ありがとうございます! send_fileで複数ファイルをダウンロードすることはできないと理解しました。 下記内容で、zipファイルに纏めてダウンロードすることができました。 # app.py(抜粋) # モジュールのインポートを追加 import time import zipfile from io import BytesIO : @app.route('/all_download') def download_all(): dir = 'data' data_files = os.listdir(dir) memory_file = BytesIO() # メモリ上に作成 with zipfile.ZipFile(memory_file, 'w', zipfile.ZIP_DEFLATED) as zf: # 圧縮する os.chdir(dir) # データ格納ディレクトリへ移動 for individualFile in data_files: print('データファイル圧縮: ' + individualFile) zf.write(individualFile) memory_file.seek(0) return send_file(memory_file, attachment_filename='data.zip', as_attachment=True) # 「全てダウンロード」ボタンをクリックした際のターミナルの表示 データファイル圧縮: aaa.txt データファイル圧縮: bbb.txt データファイル圧縮: ccc.txt 127.0.0.1 - - [22/May/2019 18:35:55] "GET all_download HTTP/1.1" 200 - 無事圧縮ファイル「data.zip」がダウンロードできました! ※ ファイルシステム上に存在するファイルをアーカイブする場合は、write関数を使用 https://python.civic-apps.com/zipfile/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問