RequestHandler.request.arguments.items()中出现意外的图像内容

时间:2015-10-13 00:38:17

标签: python curl httpwebrequest tornado

我目前遇到因未在卷曲请求中附加标题Content-Type而导致的错误。

提出正确的请求

curl -v -XPOST -H'Content-Type: image/png' -d@image.png "localhost:9000"

RequestHandler.request.arguments.items()是一个干净的清单[]

但是,如果我删除-H'Content-Type: image/png'标题,只需执行以下操作:

curl -v -XPOST -d@image.png "localhost:9000"

arguments.items()将完全混乱 - 它现在包含一个看起来像这样的随机unicode列表:

[('', ['\x19\xf4cX0\xd4A\x86\xd2\x90\x0e\xcf\xa9p\xe5\x82:\x8c\xa8VJz\xc4\xd8Pa\xbfr\xb9`\xc7\xa4\xa8\x90<\xb5\xe3\xd4\x15\xb8\xb9\xfec.*\xff\xd7\xe0rb\xae\x16\x9a\xf5\x08\x9e\xc5\x7f\xd0\x8b\xdf\x9d\x0fQ2, ......

我认为这是我所附图像的内容。

如何解决此问题?是否有某些标志/功能/等我可以在龙卷风中使用,以防止数据丢失?或者我是否必须让用户包含'Content-Type'标题?

编辑:

很抱歉我之前没有说清楚,我想提取RequestHandler.request.arguments.items()中的内容,其中可能包含我需要的一些值。

2 个答案:

答案 0 :(得分:0)

您似乎正在尝试将图片上传到网站。 Content-type没有必要。您需要发送HTTP Multipart Data

根据此answer,您需要使用-F发送多部分数据:

curl -F "image=@/home/user1/Desktop/test.jpg" "localhost:9000"

对于tornado部分,您可以使用self.request.files来访问上传的文件。这是example

答案 1 :(得分:0)

request.arguments用于HTML表单参数。使用-d@image.png时,数据不是作为表单参数发送,而是作为原始主体发送,因此您需要从request.body读取数据。这通常使用方法PUT代替POST

或者,您可以在@ skyline75489的答案中更改使用多部分表单包装器的请求,并从request.files读取图像。