2

現在、すべての静的ファイルを S3 に移動し、サイトにいくつかの画像をアップロードできるようにしています。一般的に、これは素晴らしく進んでいます。既存のすべての css および js ファイルを問題なく S3 まで取得しましたが、画像をアップロードして S3 に保存するのに問題があります。

具体的には、ビュー内でファイルのアップロードを処理する方法は次のとおりです。

image_file = request.files["imageurl"]
if image_file and allowed_file(image_file.filename):
    fn = "products/%s" % secure_filename(image_title + "." + image_file.filename.split(".")[-1])
    image_file.save(url_for('static', filename=fn))
else:
    response = app.make_response(render_template(
        'admin/newImage.html',
        title=title,
        error="That Image file is invalid.")
    )
    return response

これはすべて、POST 要求ハンドラーでラップされています。ここでの問題はurl_for('static')、正しいパスへのリンクに失敗することです。そのIOErrorため、このような画像を保存しようとするたびにエラーが発生します。

通常、私は自分のディレクトリ構造でばかげたことをしているだけだと思いますが、同じパターンがurl_for静的ディレクトリ内のファイルに対して完全に機能します。これを修正する方法についてのアイデアはありますか?これが私のディレクトリ構造です(表示用にトリミングされています)

├── SpoolEngine
│   ├── admin.py
│   ├── __init__.py
│   ├── templates
│   │   ├── admin
│   │   │   ├── base.html
│   │   ├── base.html
│   │   ├── _forms.html
│   │   ├── posts
│   │   │   ├── complete.html
│   │   └── super_user
│   │       ├── base.html
│   ├── users.py
│   └── views.py
└── static
    ├── css
    │   ├── admin.css
    │   └── zebraTable.css
    ├── img
    │   └── subtle_grunge.png
    ├── js
    │   ├── compatibility.js
    │   ├── list.js
    │   ├── login.js
    │   └── profiler.js
    └── products

参考までに、url_for は完全に動作し、 Any idea?/static/cssの間違った URL にリンクしています。admin.py

4

1 に答える 1

1

url_forURL パスを返します。ファイルシステムのパスではありません。

/static/somethingしたがって、システムにとって、アプリケーションパスではなく、ファイルシステムのルートから始まるパスを意味するファイルを保存しようとしています。

staticこのようなものでファイルのパスを作成できます

static_path_to_save = os.path.join([app.root_path, '/static', fn])

補足として、アップロードを処理するときは、すべてのパスをサニタイズし、宛先を再確認することを忘れないでください。ユーザーから提供されたを使用する場合はスラッシュを削除するなど、ベスト プラクティスが適用filenameされます (ファイル名を生成する場合が最適です)。

あなたのコードでは、2 人のユーザーが同じ名前のファイルをアップロードして互いに上書きすると、問題も発生します。しかし、これはおそらくあなたの文脈では安全です。

于 2013-08-24T11:02:15.970 に答える