Flask-Uploads 权限被拒绝

5

我在我的Flask应用程序中使用Flask Uploads来进行上传表单。但是,每当我尝试保存文件时,就会出现以下错误:

File "/Users/Documents/virtual_environment/bin/../lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/app'

看起来上传没有必要的权限来保存文件?这是我使用flask-uploads的配置:

UPLOADS_DEFAULT_URL = os.environ.get("UPLOADS_URL", "http://localhost:5000/")
UPLOADS_DEFAULT_DEST = "/app/uploads/"
UPLOAD_EXTENSIONS = set(["csv", "xls", "xsls"])

此外,以下是我保存实际文件的方法:
@app.route('/upload', methods = ['GET', 'POST'])
@app.route('/upload/', methods = ['GET', 'POST'])
@roles_accepted('admin', 'team')
def r_upload():
    form = FileUploadForm()

    if form.validate_on_submit():
        filename = uploadSet.save(form.uploadfile.data)
        url = uploadSet.url(filename)
        flash("%s uploaded <a href=\'%s\'>HERE</a>!" % (filename, url))

    return render_template('/uploads.html',
        dashboard_title = "%s Uploads" % g.name,
        form = form)

错误是由于存储行引起的。您有什么修复建议吗?谢谢。

1
你的 Linux 用户是否对 /app/uploads/ 目录拥有文件权限?使用 ls -la /app/uploads 命令来检查。 - Anshul Goyal
3个回答

4

您的Linux用户是否对/app/uploads/拥有文件权限?可使用ls -la /app/uploads查看。

请注意,/app会尝试在文件系统根目录下/写入文件。

如果您想在应用程序中编写文件,请使用app/uploads而不是/app/uploads/。从错误信息来看,似乎/app并不存在,而写入app/uploads正是您想要做的。


我本来也想自己发布这个答案!刚刚弄明白了。谢谢!很奇怪,似乎flask-uploads文档中的目录设置方式正好相反。 - kevin.w.johnson
1
一般来说,在文件系统上使用绝对路径可以减少意外情况。您可以使用 os.path.abspath(os.path.dirname(__file__)) 来确保始终相对于当前模块的位置工作。说到底,无论如何都可以,只需确保运行 WSGI 应用程序的用户对文件夹具有写入权限即可。 - dirn

0

我知道这已经晚了5年,但我会把这个放在这里,供将来看到的人参考。

我的解决方案是创建一个同名的空文件(open("path/to/file.png").close()),然后保存文件。


0

如果您也遇到了(PermissionError:[Errno 13]权限被拒绝:)的问题,那么这可能对您有所帮助。

#导入 from flask import Flask, render_template, reques

#代码 [python] @app.route("/img", methods=["GET", "POST"]) def get_img(): r = request.files.get("file1") with open("n.png", "wb") as fp: for itm in r: fp.write(itm) return "done"

代码 [html]

<html>
<head>

</head>

<body>
<form action="/img" method="post" enctype="multipart/form-data">
    <input type="file" id="22" style="margin-top: 100px;" name="file1">
    <button type="submit" style="margin-top: 100px;">send</button>
</form>
</body>
</html>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接