Open observerss opened 6 years ago
Thanks for reporting.
感觉作为库还是不 monkey patch 好,交给用户决定是否 patch/改用 ascii 文件名。 这个问题可以加入文档/FAQ 中。
之前的work around会让中文无法显示,实际上类似curl的编码方式应该是wireshark抓包时添加的,所以其实encode_name这个方法直接不进行encode就行了
def encode_name(name, codec='utf-8'):
return name
@messense 对的我也这么觉得,感觉也没有像样一点的解决方案,只能作为FAQ了
可以用 curl -v
来看 curl 传输的内容而不需要用 wireshark 抓包
curl -v 好像只能看到headers, multipart我没找到要怎么看
用 nc -l 8080 试了下:
curl -XPOST localhost:8080 -F meida=@测试.txt
nc -l 8080
POST / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.54.0
Accept: */*
Content-Length: 195
Expect: 100-continue
Content-Type: multipart/form-data; boundary=------------------------67398d7eafdff208
--------------------------67398d7eafdff208
Content-Disposition: form-data; name="meida"; filename="测试.txt"
Content-Type: text/plain
hello
--------------------------67398d7eafdff208--
没有解决办法???
use urllib.quote
ret_data = client.material.add('image', (urllib.quote(os.path.basename(image_url)),
image_file,
mime_type))
重现步骤 (Reproducing)
问题实质
问题的实质是微信服务器端在解析multipart时不支持rfc2231格式的编码,而requests包发送的正是这种格式。
在文件名是中文时,比如"中文.jpg",
filename*=utf-8''%E4%B8%AD%E6%96%87.jpg
filename="\\344\\270\\255\\346\\226\\207.jpg"
Workaround
我暂时的workaround是monkey patch编码部分