Curl POST запрос на загрузку файла возвращает false - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь использовать gfycat API для создания gfycat с загрузкой файла через curl с помощью php, но он не работает, а var_dump ($ response) дает мне bool (false).

Мой код:

$file_path = $target_dir.$newfilename;
$cFile = curl_file_create($file_path);
$data = array(
     "file" => $cFile,
);
$target_url = "https://filedrop.gfycat.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
     "Content-Type: multipart/form-data"
));            

$response = curl_exec($ch);
var_dump($response); // bool(false) here

curl_close($ch);

Помощь будет очень признателен.Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Кстати, я получил это работать с этим:

$file_path = "ABSOLUTE_FILE_PATH".$newfilename;
$cFile = curl_file_create(realpath($file_path));
$data = array(
"key" => $newfilename,
"file" => $cFile,
);
$target_url = "https://filedrop.gfycat.com";

$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_URL, $target_url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
"Content-Type: multipart/form-data"
));

$response = curl_exec($ch);

curl_close($ch);
0 голосов
/ 11 июня 2018

при отладке curl-кода часто рекомендуется включить CURLOPT_VERBOSE и проверить журнал stderr.Более того, если curl_exec повторно установил bool (false), это означает, что возникла проблема с передачей, и вы можете использовать функцию curl_error () для получения сообщения об ошибке.и, наконец, не устанавливайте заголовок "Content-Type: multipart/form-data" вручную, curl установит этот заголовок для вас, и, в отличие от вас, curl не будет делать никаких опечаток при этом, и, что еще хуже, вы рискуете перезаписать / удалить параметр borderheader.

попробуйте

$file_path = $target_dir . $newfilename;
$cFile = curl_file_create ( $file_path );
$data = array (
        "file" => $cFile 
);
$target_url = "https://filedrop.gfycat.com";

$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_URL, $target_url );
curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
try {
    $stderrh = tmpfile ();
    curl_setopt_array ( $ch, array (
            CURLOPT_VERBOSE => 1,
            CURLOPT_STDERR => $stderrh 
    ) );
    $response = curl_exec ( $ch );
    if ($response === false) {
        throw new \RuntimeException ( "curl error " . curl_errno ( $ch ) . ": " . curl_error ( $ch ) . " - verbose log: " . file_get_contents ( stream_get_meta_data ( $stderrh ) ['uri'] ) ); // https://bugs.php.net/bug.php?id=76268
    }
} finally{
    curl_setopt_array ( $ch, array (
            CURLOPT_VERBOSE => 0,
            CURLOPT_STDERR => STDERR 
    ) );
    fclose ( $stderrh );
}
var_dump ( $response ); // bool(false) here
curl_close ( $ch );

сейчас, если есть ошибка, она должна дать вам хороший подробный журнал того, что произошло до ошибки curl, в журнале ошибок исключений.

...