@valerik606
Web Developer

Как правильно отдать файл через headers для CURL?

Есть сервис, который отдает файл, вот код:
ob_clean();
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . $fileName);
readfile($pathToFile);
exit;


Есть другой сервис, которому нужно получить от первого сервиса файл
$url = <url к получению файла на первом сервисе>;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
$result = curl_exec($ch);
curl_close($ch);

В $result пишется false, файл не передается. Подозреваю, что либо не те заголовки отдаю, либо curl не так использую. Как правильно использовать такую связку и будет ли вообще она работать?
  • Вопрос задан
  • 1163 просмотра
Решения вопроса 1
@PavelFokeev
pavl1k.ru
Проверьте наличие ошибок
if(curl_errno($ch)) echo 'Ошибка: ' . curl_error($ch);

Код правильный. В переменной $result должно быть содержимое файла.

Если используете защищенное соединение (HTTPS) необходимо добавить curl опции:
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
header("Content-Type: ".mime_content_type($pathToFile));
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename*=UTF-8''".str_replace('+', '%20', urlencode($fileName)));
header("Content-Length: ".filesize($pathToFile));
ob_clean();
flush();
readfile($pathToFile);
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
1 сервис должен отдавать файл через xrealpath это для ngnix (это самый экономный вариант через скрипт ( можно передавать даже видео не нагружая скрипт и сервер все будет отдавать аля ngnix как статику )
2 принимающий скрипт через curl
скачивание файлов обычно проходит так
$file = 'путь куда сохранить файл'
$destFile = @fopen($file, "w");
дальше curl нужно выставить след. настройки
curl_setopt($ch,CURLOPT_FILE, $destFile)
curl_setopt($ch,CURLOPT_HEADER, 0);
curl_setopt($ch,CURLOPT_MAXREDIRS,5);
curl_setopt($ch,CURLOPT_TIMEOUT,300);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$result = curl_exec($ch);
curl_close($ch);
fclose($destFile );
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы