SummerEye part5 -リネーム&ダウンロード-
前回はflaskプロジェクトからファイルをBLOBにアップロードし、Computer Vision APIでディスクリプションを取得しました。
今回はそのディスクリプションを新しいファイル名としてアップロードしたファイルをzipでダウンロードすることを目指します。
(BLOBリネームは面倒そうだったので後でできたら実装)
スペースをハイフンに置換
ファイル名にスペースが含まれるのは気持ち悪いのでハイフンに置換して起きます。
description = description.replace(" ", "-")
ダウンロード
目標は、ブラウザを閲覧しているクライアントのストレージに複数の画像ファイルを保存することです。
できればzipにして渡したい。
クライアント側にファイルを保存する方法がわからず、迷いました。
そしてできれば、「画像を一時サーバに保存」という手法は取りたくないです。
失敗 requests.get(), write()
requests.get()でURLから画像取得。
write()で保存。
サーバ側に保存される。
ダメ。
send_file()
return send_file(‘./images/image.jpg’, attachment_filename=’rename.jpg’)したところ、指定したURLの画像がブラウザに表示されました。
そうじゃなくてダウンロードを開始したい。
ちゃんとメソッドの説明を読みます。
as_attachmentをTrueにするとContent-Dispositionがattachmentとされるのでダウンロードできまるらしい。
これでローカルのファイルはダウンロードできました。
return send_file(‘./images/image.jpg’, attachment_filename=’rename.jpg’, as_attachment=True)
しかし本当はURL指定でダウンロードさせたい。ストリームからできないかな。
あと複数ファイルを扱いたい。zipファイルでダウンロードさせたい。
でも後述する通りzipファイルをダウンロードさせるには一旦それをサーバに保存しなくてはいけない。
一番楽なのは、
- ユーザがアップロード
- Web App内に保存
- Computer Vision APIに投げる
- サーバ内でリネーム
- zipに圧縮
- zipファイルをクライアントサイドでダウンロードさせる
つまりBLOBがいらなくなる。
デプロイ
そこら辺ザーッと実装して(zip後回し)、一旦Web App側で動作を見てみようとpushしたらエラー。
なにやらpipでこけているみたい。
ValueError: ('Expected version spec in', 'azure-batch ~=3.0.0', 'at', ' ~=3.0.0')
調べたら、Python3.4.1ではこれが出るらしい。
マイナーバージョンまであってれば平気でしょとよく調べもせずにローカルではPython 3.4.4を使っていました。
ローカルでも3.4.1にして、
pip install azure
同じエラーが出ました。
pipが古いのが理由のようです。
これで通りました。
pip install --upgrade pip pip install azure
ローカルでflaskの挙動チェック。問題なし。
Azure側も対処します。
Web Appの「開発ツール -> 高度なツール -> 移動」で新しいタブが開きます。
「Debug console -> CMD」でコンソールが開きます。
pipのバージョンを確認してみる。
pipなんてないと言われる。???。
D:\home\site\wwwroot> pip -V 'pip' is not recognized as an internal or external command, operable program or batch file.
easy_installからアップグレードする。
env\scripts\python -m easy_install --upgrade --user pip
env/Scriptsの中ならpipコマンドを認識するようです。
cd D:\home\site\wwwroot\env\Scripts D:\home\site\wwwroot\env\Scripts> pip -V pip 9.0.1 from D:\home\site\wwwroot\env\lib\site-packages (python 3.4)
これで漸くデプロイが通りました。
意気揚々とアクセスすると、エラー。
次回
エラーの原因を解明します。
zipファイルにする
これを参考にすればできそう。
ただしzipファイルをダウンロードさせる場合、一旦このzipファイルがサーバ内に保存されていなければいけないっぽい?
あまり、Web App内にファイルを貯めたくないのですが。
一旦はこれで実装します。
参考
- Flask – When to use send_file / send_from_directory – Stack Overflow
- API – Flask Documentation (0.12)
- 11.2. os.path — Common pathname manipulations Python 3.6.3rc1 documentation
- Python + Bottle でファイルのダウンロードを実装 – Qiita
- http – How to send zip files in the python Flask framework? – Stack Overflow
- ファイルをダウンロードさせたいとき – Qiita
- python – Using PIP in a Azure WebApp – Stack Overflow