【问题标题】:Permission denied on deployed Flask app file upload using AJAX使用 AJAX 上传已部署的 Flask 应用程序文件的权限被拒绝
【发布时间】:2013-12-01 01:57:16
【问题描述】:

我的文件上传在内置的 Flask 服务器上运行良好,但是在我部署它时文件上传中断了 (Apache2)。

烧瓶python代码:

@app.route('/uploadajax', methods=['POST', 'GET'])
def upload():
    file = request.files['file']

    if file and allowed_file(file.filename):
        filename = secure_filename(file.filename)
        file.save('TEST.pdf')

    return jsonify({'filename':'http://www.michigan.gov/documents/sprsConnectionsVol5No1_15852_7.pdf'})

Javascript:

$(function() {
    $('#upload-file-btn').click(function() {
        var form_data = new FormData($('#upload-file')[0])
        $.ajax({
            type: 'POST',
            url: SCRIPT_ROOT + '/uploadajax',
            data: form_data,
            contentType: false,
            cache: false,
            processData: false,
            async: false,
            success: function(data) {
                console.log('Loaded questions successfully.')
                packet_frame = '<iframe src="http://docs.google.com/viewer?url=' + encodeURI(data['filename']) + '&embedded=true" width="100%" height="260" style="border: none;"></iframe>'
            }
        })
    })
})

如果我注释掉 file.save('...') 行没有错误。具体错误是

[Sat Nov 30 20:43:21 2013] [error] [client 66.75.0.4]     file.save('TEST.pdf'), referer: http://mydomain.com/
[Sat Nov 30 20:43:21 2013] [error] [client 66.75.0.4]   File "/usr/local/lib/python2.6/dist-packages/werkzeug/datastructures.py", line 2576, in save, referer: http://mydomain.com/
[Sat Nov 30 20:43:21 2013] [error] [client 66.75.0.4]     dst = open(dst, 'wb'), referer: http://mydomain.com/
[Sat Nov 30 20:43:21 2013] [error] [client 66.75.0.4] IOError: [Errno 13] Permission denied: 'TEST.pdf', referer: http://mydomain.com/

我认为这不会发生,因为我只写入子目录而不是根目录,但仍然存在权限被拒绝错误。有什么帮助吗?

【问题讨论】:

    标签: python ajax flask


    【解决方案1】:

    您正在保存的文件没有路径信息。这意味着它将被保存在当前工作目录中,无论它可能用于 Apache 进程。您在那里没有写权限。这个工作目录几乎肯定与您的项目代码的存储位置相同。

    指定文件的路径。您可以使用基于当前模块的目录(os.path.dirname(__file__) 是当前模块的目录),或者为您的应用程序配置目标路径。

    您可能想在这种情况下研究Uploading Files pattern

    【讨论】:

    • 我更改了它以匹配该网站的结构;同样的事情也会发生。 pastebin.com/dLUG88jt 用于错误日志
    • stackoverflow.com/questions/7645974/… 会帮忙吗?我不想永久弄乱任何权限。
    • 对,是的,您必须授予www-data 用户写入权限,配置 WSGI 设置以使用单独的进程和特定用户。
    • 谢谢你,成功了。现在我需要获取我上传的文件的链接(用于 Google Docs Viewer),但我不确定我的应用程序根目录在哪里。我的 apache2 配置中有“DocumentRoot /var/www”,但是当我尝试 www.mydomain.com/html/myapp/myapp.py (/var/www/html/myapp/myapp.py 是现有文件)时,我收到 404。有什么方法可以获取我上传文件的 URL?
    • @user3024025:os.getcwd() 告诉你当前的工作目录是什么?
    【解决方案2】:

    我通过给出相对路径而不是在文件路径中给出绝对路径来解决它。

    【讨论】:

      猜你喜欢
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      • 2021-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多