【问题标题】:Python receive formData from POST request, get the stream, File CorruptPython 从 POST 请求中接收 formData,获取流,文件损坏
【发布时间】:2017-09-18 05:06:03
【问题描述】:

我是网站开发的新手。我使用 React-Redux 和 Python 作为我的后端(Falcon 框架),我所做的是:

1) 从前端接收一个 formData(),使用 Dispatch 到 POST :

我的调度代码:

this.props.dispatch({type: ActionTypes.FILE_UPLOAD_REQUEST, email: this.state.email, file: this.state.policyFile});

并且使用中间件,只调用函数POST:

var result = yield call(Atlas.uploadFile, action.email, action.file);

还有我的 fetch 函数:

export const uploadFile = (email, file) => {
    console.log(file);
    return fetch(`${BASE_URL}/v1/files/${email}/policies`, {
        method: 'POST',
        body: file,
        headers:{}
    })
    .then(response => response.json())
}

和我的后端,使用 falcon API:

def on_post(self, req, resp, email):
    local_path = create_local_path(req.url, req.content_type)
    with open(local_path, 'wb') as temp_file:
        body = req.stream.read()
        temp_file.write(body)

问题是 temp_file 已创建但已损坏,并且在我将扩展名更改为 txt 文件后。它应该用一些只有计算机才能理解的奇怪代码编写。但是有些行会使整个文件损坏。请帮忙。这是txt文件的样子:

------WebKitFormBoundaryQXmL1AgwA112xzkA
Content-Disposition: form-data; name="file"; filename="baboon.jpg"
Content-Type: image/jpeg

ˇÿˇ‡JFIFˇ€Ñ   ( %!1"%)+...383-7(-.+

-%---------------.----------------------------7--- -- ˇ¿„fi"ˇƒˇƒ>!1AQ"aqÅë°2B±¡R—·#brÒÇí¢$3Scˇƒˇƒ'!1QAa"#2BqÅˇ⁄?"G ÷=`^— Á»÷$ìØxıXÄ‘Å', 5kÔVãW¶±ÈK@¡tq]~¸¢J^dö±“≈B–Ba.'QoQ∏0dúC•,nı^⁄•1BR¢âò ´Ô¨C⁄ƒXΩ¡ ¨Eb & 继续前进

查看前 3 行,它使文件损坏。

有什么想法吗?

【问题讨论】:

    标签: python file-upload react-redux form-data falconframework


    【解决方案1】:

    Falcon 不像您尝试开箱即用那样处理文件上传 - 您需要使用像 https://github.com/yohanboniface/falcon-multipart 这样的东西,它提供了处理多部分/表单数据上传的中间件。

    您将添加中间件,执行以下操作:

    from falcon_multipart.middleware import MultipartMiddleware
    
    api = falcon.API(middleware=[MultipartMiddleware()])
    

    您可能想要更改前端代码(请参阅fetch post with multipart form data),但我不确定您使用的是什么框架。

    完成此操作后,您最终可能会得到看起来更像的处理程序代码(假设您在名为“图像”的表单字段中传递文件):

    def on_post(self, req, resp, email):
        local_path = create_local_path(req.url, req.content_type)
        with open(local_path, 'wb') as temp_file:
            body = req.get_param('image')
            temp_file.write(body)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-05-11
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 2011-07-14
      相关资源
      最近更新 更多