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 在任何想法中完美地工作/static/css并链接到错误的 url ?admin.py

4

1 回答 1

1

url_for返回一个 url 路径。不是文件系统路径。

所以你试图保存你的文件/static/something,对于系统来说,这意味着从文件系统的根目录开始的路径,而不是你的应用程序路径。

static你可以用这样的东西为你的文件创建路径

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

附带说明一下,在处理上传时,请记住清理所有路径并仔细检查目的地。最佳实践适用,例如,如果您使用filename用户提供的,则剥离斜杠(最好是生成文件名)。

在您的代码中,如果 2 个用户上传同名文件并相互覆盖,我也会看到一个问题。但这在您的上下文中可能是安全的。

于 2013-08-24T11:02:15.970 回答