【问题标题】:Parsing jQuery formdata from Python从 Python 解析 jQuery 表单数据
【发布时间】:2012-08-02 08:37:09
【问题描述】:

我的应用程序有一个 python (bottle.py) 后端和一个 html/jquery 前端。 我正在使用表单中的“输入”获取文本文件,并在后台使用 python 端的事件处理程序将其上传。然后事件处理程序解析文件(重复调用file.readline())并以json形式返回一些结果。

一切顺利,直到我需要在 python 中解析文件。

这是我的 javascript:

function UploadFile() {
    var file = $('#data')[0].files[0];
    var formData = new FormData();
    formData.append("file", file);
    $.ajax({
        url: 'plates',
        type: 'POST',
        data: formData,
        cache: false,
        contentType: false,
        processData: false,
        success: function(data){
            ...
        }
    });
}

当我在 python 端收到 POST 请求时,我只能使用request.body.read().decode() 读取它。如果我尝试request.files.data.file.read(),我会收到“破管”错误:

socket.error: [Errno 32] Broken pipe

我可以使用request.body.read().decode() 获取文本,将它们保存到文件中,然后加载并解析。但我想避免创建不需要创建的文件,并且想在内存中做所有事情。

为什么request.body.read().decode() 有效而request.files.data.file.read() 无效? 有什么方法可以用我现有的函数解析文件而不将其写入磁盘?

【问题讨论】:

    标签: jquery python ajax bottle form-data


    【解决方案1】:

    我建议确保您的请求使用内容类型“multipart/form-data”提交。默认值为“application/x-www-form-urlencoded”,这可能不是瓶子在尝试解析文件时所期望的。

    如果您想了解有关在 HTTP 中处理多部分表单(包括文件)的更多信息,

    RFC 2388 是一个很好的(虽然很厚)信息来源

    另外,这是一个good discussion about file upload with jQuery

    【讨论】:

      【解决方案2】:

      我完全不知道为什么这两个调用是不同的(我使用 django),但是您在不写入磁盘的情况下解析它的方式是获取一个新的 BytesIO 实例,写入该实例,然后使用它代替您的文件处理。只是部分解决方案。

      如果只是文本,考虑使用 StringIO 代替

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-03
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        • 2012-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多