我有一个 Toshiba FlashAir 卡,它是一个支持 Wi-Fi 的 SD 卡,显然在嵌入式 Linux 上运行一个网络服务器。
我正在尝试将文件上传到它,这是通过标准的 multipart/form-data 帖子,根据https://www.flashair-developers.com/en/documents/api/uploadcgi/
所以它适用于 Firefox/Chrome/IE,它适用于 curl:
curl --form data=@mydatafile.gcode http://flashair.local/upload.cgi
但是,如果我使用 Python 请求,它就不起作用:
r=requests.post('http://flashair.local/upload.cgi',
files={'files': open('mydatafile.gcode', 'rb')})
设备以“NG”响应拒绝它,这是它的标准“我放弃”(它不是很亮)
我仔细研究了将请求发送到http://httpbin.org/post的结果,它们看起来并没有本质上的不同。我还准备了请求并查看了正文和标题。它们几乎与浏览器或 curl 具有相同的标头、相同的有效负载和相同的请求结构。
其他工作正常:
requests.get('http://flashair.local/upload.cgi?WRITEPROTECT=ON')
requests.get('http://flashair.local/upload.cgi?UPDIR=/')
有谁看到我错过了什么?或者可以提出一些调试技巧?
编辑:我终于想通了。事实证明,您必须明确指定文件名和“文本/纯文本”的 mime 类型
r=requests.post('http://flashair.local/upload.cgi', files={'file': (file, open(file, 'rb'), 'text/plain')})
对于像 Apache 这样的其他网络服务器,我不必这样做,但这是一个非常简单的服务器。