我在尝试通过PHP中的cURL使用POST方法传递信息时遇到问题。
我的“train.php”文件包含以下内容:
<?php
$tfile = $_FILES["newtrain"];
$filepath = $tfile['tmp_name'];
$fields = array(
"training_metadata" => '{\\"language\\":\\"pt\\",\\"name\\":\\"TestClassifier\\"}',
"training_data" => '@'.$filepath
);
$params = http_build_query($fields);
$tSession = curl_init();
curl_setopt($tSession, CURLOPT_URL,"myURL.com");
curl_setopt($tSession, CURLOPT_USERPWD, "user:password");
curl_setopt($tSession, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($tSession, CURLOPT_RETURNTRANSFER,true);
curl_setopt($tSession, CURLOPT_HEADER, true);
curl_setopt($tSession, CURLOPT_POST, true);
curl_setopt($tSession, CURLOPT_POSTFIELDS, $params);
$train=curl_exec($tSession);
if($errno = curl_errno($tSession)) {
$error_message = curl_strerror($errno);
echo "cURL error ({$errno}):\n {$error_message}";
}
print_r($train);
curl_close($tSession);
?>
当我从终端发送cURL命令时的等价物如下(或者更确切地说,我的PHP应该模仿这个):
curl -i --user "user":"password" -F training_data=@/Users/PT020555/file.csv -F training_metadata="{\"language\":\"pt\",\"name\":\"TestClassifier\"}" "myURL.com"
我搜索过,我不应该使用http_build_query()
得到415(显然实际上已经解决了?),所以我不确定问题出在哪里。
我还尝试将$fields
数组直接传递给curl_setopt($tSession, CURLOPT_POSTFIELDS, $fields);
,在这种情况下,我收到400错误请求:
{“code”:400,“error”:“缺少元数据”,“说明”:“缺少所需的培训元数据。除了培训数据,请求应包含'语言'和'名称'。” }
我也尝试根据this question以下列格式编写$fields
数组,但我不确定是否应该urlencode()
,在哪里,以及我是否必须尝试逃避字符:
$fields = array(
"training_metadata: '{\\\"language\\\":\\\"pt\\\",\\\"name\\\":\\\"TestClassifier\\\"}'",
"training_data: @$filepath"
);
在之前的案例中,我还收到400 Bad Request,如果我申请http_build_query()
,我会再次获得415。
该文件来自此HTML - 我从这里获取file.csv:
<FORM id = "formtr" NAME = "formtr" METHOD = "POST" action = "curl_train.php" enctype ="multipart/form-data">
<label for="newtrain">Data for training</label>
<input id="newtrain" name="newtrain" type="file" required>
<input type="submit" class="submit" id='train' name = 'train' VALUE = "Train new"> </form>
我在Mac上,如果相关的话。
有人可以告诉我我做错了什么吗?谢谢!