【问题标题】:How to show images on web pages using Ajax in Flask?如何在 Flask 中使用 Ajax 在网页上显示图像?
【发布时间】:2018-11-03 10:39:46
【问题描述】:

我是 Python Flask 的新手。虽然,我已经在 PHP/Java 中多次完成此任务,但不知何故我被困在这里。

我的任务是将图像上传到服务器,然后在网页上显示图像,对图像进行一些处理,然后再次在客户端机器上显示处理后的图像。

为此,我在 Github 上使用flask-fileupload-ajax-example 的代码。我能够在网页上使用 ajax 正确显示文件名及其大小。但是,不知何故,当我尝试通过上传图像的路径设置<img> 标签的src 时,它给出了404, File not found error

以下是相关代码sn-ps。

app.py

@app.route('/uploadajax', methods=['POST', 'GET'])
def upldfile():
    if request.method == 'POST':
        files = request.files['file']
        print(files)
        if files and allowed_file(files.filename):
            filename = secure_filename(files.filename)
            app.logger.info('FileName: ' + filename)
            print('FileName: ' + filename)
            updir = os.path.join(basedir, 'upload/')
            files.save(os.path.join(updir, filename))
            file_size = os.path.getsize(os.path.join(updir, filename))
            file_path = '/'.join(['upload', filename])
            return jsonify(name=filename, path=file_path, size=file_size)

app.js 文件中:

$('#submit').click(function() {
    event.preventDefault();
    var form_data = new FormData($('#uploadform')[0]);
    $.ajax({
        type: 'POST',
        url: '/uploadajax',
        data: form_data,
        contentType: false,
        processData: false,
        dataType: 'json'
    }).done(function(data, textStatus, jqXHR){
        console.log(data);
        console.log(textStatus);
        console.log(jqXHR);
        console.log('Success!');
        $("#resultFilename").text(data['name']); // name of the file
        $("#resultFilesize").text(data['size']); // size of the file
        //my_url = "{{ url_for('upload', filename="+data['name']+" }}";
        $("#image").attr('src', data['path']); // setting the src attribute of img tag
        $("#adv-btn").attr('value', data['name']);
        $("#adv-btn").show();
        //get_image(data['name'])
    }).fail(function(data){
        alert('error!');
    });
});

我也尝试过使用url_for,但它没有被渲染。任何建议将不胜感激。谢谢。

【问题讨论】:

    标签: python ajax image flask upload


    【解决方案1】:

    试试这样 在应用程序的根目录下创建一个名为 static 的文件夹,然后将上传文件夹移到那里。

    然后像这样定义你的应用程序

    app = Flask(__name__, static_url_path="/static", static_folder="static")
    app.config["UPLOAD_FOLDER"] = "/root_flask_app/static/upload/"
    

    然后在 app.py 里面试试:

    updir = app.config["UPLOAD_FOLDER"]
    

    在 app.js 内部:

    $("#image").attr('src', '/static/'+data['path']);
    

    【讨论】:

    • 感谢您的回复。但是,url_for 正在生成这个 url.. http://localhost:5000/%7B%7B%20url_for('static',%20filename=upload/file.jpg%20%7D%7D
    • 这个怎么样... $("#image").attr('src', '/static/'+data['path']);
    • 它工作正常。我不知道如何,但它正在工作。你有什么理论吗?万分感谢。 :)
    • 嗨 Gio,显然url_for() 只会在 Flask/Python 将呈现 html 页面的服务器上执行。因此,如果我们使用“Ajax/JQuery”,上述设置属性的用法将不起作用。您能否将您的问题编辑为您的评论,以便我接受答案。谢谢。
    • 理论上,您尝试显示的内容实际上位于某个位置,而您使用的 url 路径可能不是。例如,如果您定义您的 @app.route('/whatever/uploadajax') 它将继续在 localhost/whatever/uploadajax 工作......但您没有一个名为whatever 的文件夹。考虑到这一点,使用 static_folder 只是定义应用程序能够找到的路径的一种解决方法。我希望我已经清楚了......
    猜你喜欢
    • 2012-07-14
    • 1970-01-01
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多