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

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

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

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

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6540閲覧

Flaskでのファイルダウンロード方法

MorningGlory

総合スコア8

Flask

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

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/01/30 17:42

編集2020/01/31 03:31

現在Flaskを用いてローカルホストにて、テキストファイルをダウンロードする機能を実装しようとしています。

そこでFlaskのsend_file()を用いて保存したファイルをJavaScriptに送信しているのですが、chromeのデベロッパーツール内のコンソールにテキストファイルの内容が表示されるだけで、保存しますか?などのダイアログが表示されません。

htmlでdownload属性を用いてダウンロードさせようともしましたが、ダウンロードのurlがlocalhost5000から始まるurlになってしまい、ファイルが存在しませんとなってしまいます。
ディレクトリ構成は以下のようになっています。

. ├── app │   ├── __pycache__ │   │   └── app.cpython-36.pyc │   ├── app.py │   ├── event_data │   │   └── eventfile.txt │   ├── static │   │   ├── css │   │   ├── js │   │   └── lang │   └── templates │   └── index5.html └── run.py

今回の問題に対して関係のないファイルは省略しています。
サーバはクライアントから受け取ったデータをevent_data/eventfile.txtとして保存します。
このテキストファイルをローカルにダウンロードできるようにしたいのですが、flask側でどのような処理を行えばよいのでしょうか。デプロイしなければいけないのでしょうか。そもそも根本的に間違っているのでしょうか。
よろしくお願いいたします。

python

1 2@app.route("/index", methods=["post"]) 3def post(): 4 if request.headers['Content-Type'] != 'application/json': 5 print(request.headers['Content-Type']) 6 return jsonify(res='error'), 400 7 8 json_data = request.json 9 10 # 中身ソート 11 for i in json_data: 12 sort_dict(i) 13 14 with open('./app/event_data/eventfile.txt', 'w', encoding='utf-8') as f: 15 for dict_data in json_data: 16 print(*dict_data.values(), sep=',', file=f) 17 18 return send_file('./event_data/eventfile.txt', as_attachment=True, attachment_filename='eventfile.txt') 19 20

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

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

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

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

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

FiroProchainezo

2020/01/31 02:52

質問を読むと以下を行っているように見えます。 1.クライアントからサーバへファイルを送信し、サーバにファイルを保存する。 2.サーバに保存されているファイルを、クライアントにダウンロードする。 1は関係無いので、質問文に書かないでほしいです。 ダウンロードしたいのかアップロードしたいのかわからず何度か読み返しました・・・。 さて、本題です。 サーバがファイルをsend_fileしている部分は書いてありますが、javascriptでリクエストしている部分と保存しようとしている部分のソースコードがありません。 ソースコードの提示をお願いします。
MorningGlory

2020/01/31 03:37

ご回答ありがとうございます。 余計な文を質問の中に含めて混乱を招いたようで、誠に申し訳ありません。 send_file()のみでファイルを保存できるわけではないのですね.... 無知で本当に申し訳ありません。 これからsend_fileで送られたファイルをJavaScriptで受け取り ファイルを保存する処理を考えてみます。 本当にありがとうございました。
guest

回答1

0

自己解決

サーバに送ったjsonデータを、サーバはテキストファイルとして返してJavaScriptは返却されたdataから保存する。
このような簡単なことにも気づけないのは、本当に勉強不足ですね...

JavaScript

1 jQuery.ajax({ 2 type: 'POST', 3 url: '/index', 4 data: newJsonData, 5 //dataType: 'json', 6 contentType: 'application/json', 7 }).done(function(data, textStatus, jqXHR) { 8 var blob = new Blob([data], { "type" : "text/plain" }); 9 var a = document.createElement('a'); 10 a.download = 'eventfile.txt'; 11 a.href = window.URL.createObjectURL(blob); 12 a.click(); 13 alert('データを保存しました'); 14 }).fail(function(jqXHR, textStatus, errorThrown) { 15 console.log("XMLHttpRequest : " + jqXHR.status); 16 console.log("textStatus : " + textStatus); 17 console.log("errorThrown : " + errorThrown.message); 18 alert('エラーが発生しました'); 19 });

投稿2020/01/31 04:41

MorningGlory

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問