做表单参数名称,需要做一个POST时要编码?(Do form parameter names nee

2019-10-29 07:11发布

快速版:你的“形式”参数名称使用标准的multipart / form-data编码需要被送到编码?

更长的版本:在上传表单1fichier.com (上传大文件服务)使用下列指定文件参数上传:

<input type="file" name="file[]" size="50" title="Select the files to upload" />

参数的名称是文件[](注意括号)。

使用的LiveHTTPHeaders我看到参数类似这样的发送(即括号内)提交了Firefox中的表单时。 然而,对于一个节目 ,我用Python写的,我现在用的海报模块可以上传使用标准的multipart / form-data编码文件。 如果我用括号中输入参数的名称,它就会发出这样的:

file%5B%5D

在内部,海报编码使用此函数的参数的名称:

def encode_and_quote(data):
    """If ``data`` is unicode, return urllib.quote_plus(data.encode("utf-8"))
    otherwise return urllib.quote_plus(data)"""
    if data is None:
        return None

    if isinstance(data, unicode):
        data = data.encode("utf-8")
    return urllib.quote_plus(data)

该urllib.quote_plus文档中说,这只是“需要建立一个查询字符串进入一个URL时,引用HTML表单值”。 但在这里我们做一个POST,所以表单值不会在url中去。

那么,他们仍然需要进行编码,或者是海报的错误要这么做?

Answer 1:

RFC 2388覆盖的multipart / form-data的提交。 部3指定的参数名称应该是ASCII或编码为每RFC 2047 。

所以,如果你的POST请求被编码为多/表单数据(这海报是做),那么没有,参数名称并不需要被编码这种方式。 我建议提交一个bug与作者(啊哈......),他可能会愿意解决它在未来的版本;)

一种解决方法是直接设置你的MultipartParam的name属性,如

   p.name = 'file[]'


Answer 2:

虽然在本质上,这问题已经回答了,我包括如何通过这些RFC中挖掘一些更多的细节。

RFC 2388第3点的状态,一个内容处理标头被reqired。 非ASCII数据应该用编码RFC 2047 ,即使是看起来像一个冲突 。 RFC 2183第2节描述了这种内容处理标头的格式。 该name适合在一般的parameter是语法的规则,但参考RFC 2045为。 有5.1节中您发现右手边parameter或者是一个tokenquoted-string 。 无论是生产提到了表单名称的任何URL编码格式。 但是, []tspecials ,所以他们不能成为一部分token 。 所以,我们得到

Content-Disposition: form-data; name="file[]"        (correct)
Content-Disposition: form-data; name=file[]          (invalid)
Content-Disposition: form-data; name="file%5B%5D" (wrong name)
Content-Disposition: form-data; name=file%5B%5D   (wrong name)

非ASCII文件名还要说明一点:在当前HTML 5规范草案要求不编码它们在7位安全的方式,而是把它们转移在整个请求中使用的编码。 关于非ASCII字段名的一个问题是什么把我带到看看今天你的这个问题。



文章来源: Do form parameter names need to be encoded when doing a POST?