2015-06-17 3 views
0

Я пытаюсь использовать php для отправки переменных на другой php на удаленном сервере и в файле на удаленном сервере. Я хочу прочитать файл и принудительно загрузить его. Файл на удаленном сервере не находится в общей папке, поэтому мне нужно сначала вызвать файл, чтобы он аутентифицировался и получил защищенный файл.PHP - Использование CURL для аутентификации и загрузки удаленного файла

Все работает, но я не получаю никакого файла.

На удаленном PHP я использую стандарты readfile и заголовки для загрузки файла.

Возможно, проблема связана с установкой CURL, я использую стандартные вызовы CURL, есть ли какой-либо конкретный заголовок или настройка, которые мне нужно использовать, когда я вызываю CURL, чтобы загрузить файл?

Это CURL я использую

$request = curl_init(); 
curl_setopt($request, CURLOPT_URL, $postURL); 
curl_setopt($request, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($request, CURLOPT_VERBOSE, 0); 
curl_setopt($request, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($request, CURLOPT_POST, 1); 
curl_setopt($request, CURLOPT_POSTFIELDS, $postFields); 
curl_setopt($request, CURLOPT_RETURNTRANSFER, 1); 

$response = curl_exec($request); 
curl_close($request); 

Где $ postFields содержат переменные для аутентификации и подтверждения файла на другом сервере.

На другом сервере РНР после аутентификации делает нормальная сила загрузки:

header('Content-Description: File Transfer'); 
header('Content-Disposition: attachment; filename="'.$newFileName.'"'); 
header('Content-Type: application/octet-stream'); 
header('Content-Transfer-Encoding: binary'); 
header('Content-Length: ' . filesize($path)); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Expires: 0'); 

readfile($path); 

Спасибо!

EDIT: Привет, я считаю, что нашел проблему. Проблема заключается в том, что, когда я звоню через. $ Пост на JQuery локальный PHP-сервер, завиток прерывает вызов Ajax

 $.post('local.php', $(this).serialize(), function(data){ 
      alert(data); 
      } 
     }, "json").fail(function() { 
      alert('error'); 
     }); 

Так что я буду иметь, чтобы понять это, как звонить через JQuery местный. php без нарушения процесса. Спасибо за помощь!

+0

Пожалуйста, добавьте соответствующий код, который у вас уже есть (особенно инициализация завитка, даже если она не работает). Таким образом, мы сможем лучше понять, чего вы хотите достичь/где проблема. – dhh

+0

Привет @dhh Я обновил код. Благодаря! – Kitara

+0

@Kitara, как вы получаете переменные $ newFileName и $ path? Если вы поместите 'print_r ($ response)', то какой результат? –

ответ

1

Предполагая, что вы используете базовую HTTP-аутентификацию на целевом сайте - вы можете добавить информацию для входа с помощью опции CURLOPT_USERPWD.

curl_setopt($request, CURLOPT_USERPWD, "$username:$password"); 

редактировать: относительно AJAX вызова - JQuery выполнит метод fail, если сервер возвращает ошибку. Кроме того, вы указываете json как тип данных в своем ajax-вызове. Думаю, загрузка не вернет json.

редактировать 2: Я не думаю, что загрузка через $.post будет возможно, что путь, так как JQuery знает только один из xml, html, script, json, jsonp, text. Вы можете попробовать выполнить аутентификацию через свой запрос ajax, вернуть ответ ajax URL-адрес загрузки, перенаправляя браузер к этой цели. Или вы можете попробовать использовать скрытый iframe для этой загрузки. Взгляните на эти должности (here и here) - вопрос подробно обсуждается здесь.

+0

Привет @dhh, пожалуйста, см. Мое редактирование по вопросу. Спасибо за вашу помощь. Но похоже, что мне придется немного изменить процесс! Спасибо! – Kitara

+0

Привет, благодарю вас за ваш eidt. Каким будет тип возврата? Благодаря! – Kitara

+0

Спасибо, это очень помогает, и я считаю, что это правильное направление. – Kitara

Смежные вопросы