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

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

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

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

Python

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

Q&A

解決済

1回答

918閲覧

Flaskでパス指定先がかわってしまう

tarol

総合スコア5

Flask

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

Python

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

0グッド

0クリップ

投稿2022/08/04 05:10

前提

Flaskのチュートリアルを見ながらアップロードを試してます。
saveはできるのですが、send_from_directoryで読み込むと実行しているpyファイル基準のパスを読みに行きうまく動作しません。

/root ├── flaskr/ │ ├── uploads/ │ └── upload.py ├──uploads/ └──.venv/

実現したいこと

  • サブディレクトリから動作して欲しい

発生している問題

セーブ・ロードともに'./uploads'を指定しているが

/root ├── flaskr/ │ ├── uploads/ ロードの時はここを見に行く │ └── upload.py ├──uploads/ セーブのときはここにセーブされる └──.venv/

該当のソースコード

python

1# Flask公式ファイルのアップロードページより 2# https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/patterns/fileuploads.html 3 4from fileinput import filename 5import os 6from wsgiref.util import request_uri 7from flask import Flask, flash, request, redirect, url_for 8from pydantic import UrlHostTldError 9from requests import head 10from werkzeug.utils import secure_filename 11 12UPLOAD_FOLDER = './uploads' 13ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'} 14 15app = Flask(__name__) 16app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 17 18# ファイルのアップロード可否判定 19 20# .があるかどうかのチェックと、拡張子の確認 21# # OKなら1、だめなら0 22def allowed_file(filename): 23 return '.' in filename and \ 24 filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS 25 26# URL 27 28 29@app.route('/', methods=['GET', 'POST']) 30def upload_file(): 31 if request.method == 'POST': 32 if 'file' not in request.files: 33 flash('ファイルがありません') 34 return redirect(request.url) 35 file = request.files['file'] 36 if file.filename == '': 37 flash('ファイルがありません') 38 return redirect(request.url) 39 if file and allowed_file(file.filename): 40 # 危険な文字などを削除(サニタイズ処理) 41 filename = secure_filename(file.filename) 42 file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 43 # アップロード後のページに転送 44 return redirect(url_for('uploaded_file', filename=filename)) 45 return ''' 46 <!doctype html> 47 <html> 48 <head> 49 <meta charset="UTF-8"> <!-- 文字化け防止 --> 50 <title>Upload new File</title> 51 <h1>ファイルをアップロードして判定しよう!</h1> 52 <form method=post enctype=multipart/form-data> 53 <input type=file name=file> 54 <input type=submit value=Upload> 55 </form> 56 </body> 57 </html> 58 ''' 59 60from flask import send_from_directory 61 62@app.route('/uploads/<filename>') 63# ファイル表示 64def uploaded_file(filename): 65 return send_from_directory(app.config['UPLOAD_FOLDER'],filename) 66

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

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

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

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

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

guest

回答1

0

ベストアンサー

動作確認はしてませんが、

python

1 file.save(os.path.join(app.root_path, app.config['UPLOAD_FOLDER'], filename))

でしょうか。


send_from_directory の仕様として
https://flask.palletsprojects.com/en/2.2.x/api/#flask.send_from_directory

The directory that path must be located under, relative to the current application’s root path.

"アブリケーションのルートパスからの相対バス"と明記されている以上、保存もそのようにする必要があるでしょう。

投稿2022/08/04 05:44

quickquip

総合スコア11051

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

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

tarol

2022/08/04 06:03

os.getcwd()で得られるパスとapp.root_pathとは違ったのですね。 とても助かりました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問