2012-05-17 14 views
9

Flaskを習っていて、ここに書かれているアップロードファイルのパターンを調べようとしています:http://flask.pocoo.org/docs/patterns/fileuploads/。私はWindows 7上でFirefox 12で作業しています。私のローカルマシンでデバッグモードでアプリケーションを実行しています。Flask:アップロードされたファイルを保存するときのIOError

UPLOAD_FOLDER = '/uploads'として定義したUPLOAD_FOLDER変数の値を除いて、例をそのままコピーしています。アプリケーションルートに存在する "uploads"というディレクトリを作成しました(静的ディレクトリとテンプレートディレクトリ)。ファイルをアップロードする際

、私はエラーが発生します:IOError: [Errno 2] No such file or directory: '/uploads\\u.png'

を興味深いことに、私が直接UPLOAD_FOLDER = r'C:\Python27\projects\Flask\myproject\uploads'のような私のマシン上のアップロードを直接指すアップロードフォルダの生の文字列を指定した場合、すべてがうまく動作します。

正しい方法でディレクトリを指定していませんか?アップロードディレクトリを別の場所に配置する必要がありますか?

+1

更新:この置換はうまくいくようです: 'UPLOAD_FOLDER = '。/ uploads /''。私はまだなぜ、そして同じパターンがWebサーバーに展開するときに使用されるべきかを理解したいと思います。 – slachterman

答えて

12

'/ uploads'の先頭にあるスラッシュは、パス指定を絶対にします。先頭のスラッシュはファイルシステム階層のルートを表します。これはWindowsでの動作が正確ではないかもしれませんが、パス処理関数がクロスプラットフォームなので、Pythonがこのように理解することは理にかなっています。

フォーム 'uploads /'と './uploads/'は同等で、相対的なものです。

相対パスは現在のディレクトリからの相対パスであるため、必ずしも制御する必要はないため、UPLOAD_FOLDERの絶対パスを指定することをお勧めします。

+2

Windowsでは、 '/ uploads'(または' \ uploads')は現在のドライブのルートを参照します。現在のディレクトリが 'D:\ Projects \ FlaskTest'の場合、' D:\ uploads'を参照しています。 – Helgi

32

これを試してみませんか?

APP_ROOT = os.path.dirname(os.path.abspath(__file__)) 
UPLOAD_FOLDER = os.path.join(APP_ROOT, 'static/uploads') 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 
+0

私はこの解決策が好きです。非常にエレガントで、他の形態より壊れにくい。 – whoisjuan

+0

これはいいです。 – tyan

+0

os.path.join(APP_ROOT、 'static/uploads')は、pythonファイルがルートフォルダにある場合にのみ機能します。ファイルの実行パスに従ってパスを変更することを忘れないでください –