Я использую Curl для загрузки фотографий на реальный сайт. Я вижу из Fiddler, что заголовки выглядят так:
Host: test.example.com
Proxy-Connection: keep-alive
Data-Type: json
Accept-Encoding: gzip, deflate
Content-Length: 62601
Content-Type: application/json
Accept-Language: en-us
Accept: application/json
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36
Я использую точные заголовки, как указано выше. Я получаю значение для content-length
с помощью filesize
$file = 'test.jpg';
$file_size = filesize($file);
$headers = array(
"Host: test.example.com",
"Proxy-Connection: keep-alive",
"Data-Type: json",
"Accept-Encoding: gzip, deflate",
"Content-length: $file_size",
"Content-Type: application/json",
"Accept-Language: en-us",
"Connection: keep-alive",
"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
На самом деле мне не нужны заголовки, скрипт обычно работает без него, но он выходит из строя слишком часто, и в попытке устранить неполадки я вставил заголовки.
Все заголовки работают нормально, кроме content-length
, Когда я вставляю это, я получаю ответ от сервера, который указывает, что команда не правильно сформирована (я не могу показать фактический ответ здесь). Я не очень разбираюсь в content-length
но я считаю, что это сообщает серверу размер файла, и это помогает ему определить, что загрузка завершена. Я думаю, что если бы у меня все это работало правильно, это повысило бы стабильность моего сценария.
Буду признателен за любую помощь.
Если вы хотите отправить файл с curl, поместите полный filePath с предшествующим @, а curl обработает все остальное.
$headers = array(
"Proxy-Connection: keep-alive",
"Data-Type: json",
"Accept-Encoding: gzip, deflate",
"Content-Type: application/json",
"Accept-Language: en-us",
"Connection: keep-alive",
);
$data = array(
'fieldForFile' => '@'. $filePath //Don't forget @ and the complete file path to the file
'anyOtherFields' => $value,);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
// Use CURLOPT_USERAGENT for setting the user agent
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $POST_DATA);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
// Error handling
if($errno = curl_errno($ch)) {
$error_message = curl_strerror($errno);
echo "cURL error ({$errno}):\n {$error_message}";
} else {
echo "Success";
}
curl_close ($ch);
Других решений пока нет …