我目前正在将所有静态文件都移至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在
/static/css
内完美运行,并从admin.py
链接到错误的URL有任何想法吗? 最佳答案
url_for
返回url路径。不是文件系统路径。
因此,您试图将文件保存在/static/something
上,对于系统而言,这意味着从文件系统根目录开始的路径,而不是应用程序路径。
您可以使用以下内容为文件创建static
路径
static_path_to_save = os.path.join([app.root_path, '/static', fn])
顺便提一下,在处理上传时,请记住清理所有路径并仔细检查目标位置。最佳做法适用,例如,如果使用用户提供的
filename
,则应使用斜杠(最好是生成文件名)。在您的代码中,如果2个用户上传一个具有相同名称的文件,并且彼此覆盖,我也会看到一个问题。但这在您的上下文中可能是安全的。
关于python - Flask url_for错误地链接到模板之外的静态页面,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18404137/