使用AJAX部署Flask应用程序文件上载权限被拒绝

时间:2013-12-01 01:57:16

标签: python ajax flask

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

Flask 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/

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

2 个答案:

答案 0 :(得分:6)

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

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

您可能希望在此上下文中学习Uploading Files pattern

答案 1 :(得分:0)

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