【问题标题】:Use AJAX to upload a file, process, and return a result to Javascript using Flask使用 Flask 使用 AJAX 上传文件、处理并将结果返回给 Javascript
【发布时间】:2013-12-13 22:12:52
【问题描述】:

我已经弄清楚如何使用 AJAX 和 Flask 上传文件,这样页面不会刷新,并且文件会上传到某个指定目录中的服务器。 在 Python 方法 (upload()) 中,我想用一些正则表达式处理文件名并将一个数组返回给 Javascript 文件。 即使我试图请求一个数组,我是否仍然返回 render_template(index.html)?

HTML (index.html)

<form id="upload-file" role="form" action="sendQuestions" method="post" enctype="multipart/form-data">
    <div class="modal-body">
        <label for="file"><b>Upload packet here</b></label>
        <input type="file" name="file">
        <p class="help-block">Upload a .pdf or .docx file you want to read.</p>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button id="upload-file-btn" type="button" class="btn btn-primary" data-dismiss="modal" value="Upload">Upload</button>
    </div>
</form>

Javascript

$(function() {
    $('#upload-file-btn').click(function() {
        var form_data = new FormData($('#upload-file')[0]);
        $.ajax({
            type: 'POST',
            url: '/uploadajax',
            data: form_data,
            contentType: false,
            cache: false,
            processData: false,
            async: false,
            success: function(data) {
                console.log('Success!');
            },
        });
    });
});

Python(烧瓶)

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

    if file and allowed_file(file.filename):
         filename = secure_filename(file.filename)
         file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

    return render_template('index.html')

我正在尝试在 $.ajax{} 部分之后在 Javascript 中添加这个 AJAX 调用,但我做对了吗?我不确定是否可以在一个 Javascript 函数中调用相同的 Python 方法两次,或者是否有更好的方法来执行此操作。

ajaxRequest = ajaxFunction()
    ajax.onreadystatechange = function() {
        if (ajaxRequest.readyState === 4) {
            if (ajaxRequest.status === 200) {
                alert(ajaxRequest.responseText) //I want the Python to put the array into this ajaxRequest.responseText variable, not sure how.
            }
            else
                alert('Error with the XML request.')
        }
    }
    ajaxRequest.open("GET", 'uploadajax', true);
    ajaxRequest.send(null);

有什么帮助吗?谢谢。

【问题讨论】:

  • 如果你想返回数组,需要转换成json并且不发送任何模板html....只是json字符串
  • 像 jsonify(filename) 这样的东西?如何让 Javascript 识别正在发送的内容并更改
    标记以匹配?
  • 优秀的代码!帮助我完成了我的项目。

标签: javascript jquery python ajax flask


【解决方案1】:

你没有说出你想要实现的目标(隐藏一些 div、滚动窗口...),这是一个主要问题。总结一下应该做什么:
不要返回

return render_template('index.html')

但是。如果您想通知用户上传状态,请为此调用设置状态,例如

return Response('OK')

或其他状态 - NOTOK 之类的。 然后在js中:

    success: function(data) {
        console.log('Success!');
    },

操纵响应

if (data == 'OK') {
  alert ('YAY, FILE UPLOADED');
};

【讨论】:

  • 对不起。我正在使用 re.findall() 从 PDF 生成一个列表,然后我想将该列表返回给 Javascript。
  • 好的。因此,您只需在字典中收集数据。然后返回jsonify(this_dict),在上传成功部分使用。
猜你喜欢
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2011-07-01
  • 2018-04-01
  • 1970-01-01
相关资源
最近更新 更多