我必须使用他们提供的API将小.csv文件发送到合作伙伴服务器。我在Python 2.7.6中使用了Requests 2.2.1,我在PHP中有一个工作示例。我不能提供更多信息,但我想知道是否有人可以根据我的错误代码(在Python中)的输出和工作代码的输出(在PHP中)看出问题是什么
这是我所拥有的精简版本,基于发送文件的请求文档(POST a Multipart-Encoded File)
import os
import requests
filecontent=open(filename,'r').read()
r=requests.post( url
, data={'sessionId':sessionId, 'source':'Neurotracker'}
, files={'files': (os.path.basename(filename), filecontent, 'application/octet-stream')} )
print('response text=[{}]'.format(r.text))
这是我得到的那种输出
response text=[{"status":"error","error":{"descr":"Unknown error in FACTS file save path - sites\/default\/files\/facts\/csv\/2015\/04 _FILES is =
Array
(
[files] => Array
(
[name] => 344_2015-04-08T145040.csv
[type] => application\/octet-stream
[tmp_name] => \/tmp\/phpW6jG0w
[error] => 0
[size] => 223
)
)","number":106}}]
这是PHP中的一个工作示例
$post = array(
'sessionId' => $sessionId,
'source' => 'Polar',
'files[factfile]' => '@' . $file_name_with_full_path
);
$ch = curl_init();
// May want to have error checking code for the init.
//
// note order is important. POST opt sett must come before POSTFIELDs, according to docs...
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
// You should have some error handling for the result. One option is to print_r($result,true); dpm($result);
curl_close($ch);
这将是良好文件上传的输出
Array
(
[files] =\x3e Array
(
[name] =\x3e Array
(
[factfile] =\x3e 344_2015-04-08T145040.csv
)
[type] =\x3e Array
(
[factfile] =\x3e application/octet-stream
)
[tmp_name] =\x3e Array
(
[factfile] =\x3e /Applications/MAMP/tmp/php/phpQfSVVK
)
[error] =\x3e Array
(
[factfile] =\x3e 0
)
[size] =\x3e Array
(
[factfile] =\x3e 223
)
)
)
我注意到[files]的所有子键都是良好文件上传输出中的数组,而我的不是。所以我尝试了使用请求(POST Multiple Multipart-Encoded Files)
发送多个文件的方法r=requests.post( url
, data=payload
, files=[('files', (os.path.basename(filename), filecontent, 'application/octet-stream'))] );
没有更多的运气。
我觉得请求可能无法通过API以预期的格式上传文件;那将是[files]的子键中的数组。
答案 0 :(得分:1)
这对我来说有点黑魔法,但所需要的只是将'files'
更改为'files[factfile]'
:
r=requests.post( url
, data={'sessionId':sessionId, 'source':'Neurotracker'}
, files={'files[factfile]': (os.path.basename(filename), filecontent, 'application/octet-stream')} )
任何想要评论有关其工作原理的解释的人都欢迎