1

我的应用程序有一个 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()无效?有没有办法用我现有的函数解析文件而不将其写入磁盘?

4

2 回答 2

1

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

如果您想了解有关在 HTTP 中处理多部分表单(包括文件)的更多信息,RFC 2388是一个很好的(尽管很厚)信息来源

另外,这里有一个关于使用 jQuery 上传文件的好讨论

于 2012-08-02T00:37:09.883 回答
0

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

如果只是文本,请考虑改用 StringIO

于 2012-08-01T17:50:49.827 回答