2019年1月13日日曜日

FLASKアプリでクライアント側でダウンロードするとき、iPhoneにはファイルをダウンロードできない

Flaskアプリでエクセルファイルを保存して、そのファイルをスマートフォンにダウンロードさせようとしているのですが、Androidではできるのですが、iPhoneではできません。PCではできています。

iPhone、iPadではできない

csvファイルなどでは直接ブラウザ上で表示されるのですが、xlsxファイルとかはダメ。知りませんでしたがセキュリティ上の仕様のようです。
https://www.idownloadblog.com/2016/04/14/how-to-download-files-and-documents-to-iphone-or-ipad/

- xlsx NG
- 拡張子なし NG
- csv そのままhtml表示される
- pdf OK -> 保存先をブラウザで聞かれる

ということで、pdfに変換すれば大丈夫そうです。

ダウンロードの設定など

as_attachment=True として、ファイルのヘッダをContent-Disposition: attachmentとします。この設定で、ブラウザで開くのではなく、ファイルとしてダウンロードすることになります。

/send を開いたときにtest.csvをダウンロードするには・・・

#app.py
@app.route('/send')
def send():
    filename="test.csv"
    return send_file(filename_or_fp=filename, as_attachment=True)
ソースからのファイルをアップロードするならこちらを使ってください、という注意があります。
" Please never pass filenames to this function from user sources; you should use send_from_directory() instead. " このときは、configでディレクトリを指定して、その中のファイルをアップロードするように指定します。静的に保管しているファイルをアップロードするときにはこちらの方がセキュアだとのことです。
app.config['UPLOAD_FOLDER'] = '.'
@app.route('/uploads/<path:filename>')
def download_file(filename):
    return send_from_directory(app.config['UPLOAD_FOLDER'],
                               filename, as_attachment=True)

0 件のコメント:

コメントを投稿