Сохранить удаленный файл, который выдвигает заголовки для принудительной загрузки - PullRequest
0 голосов
/ 13 февраля 2009

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

Любые примеры или ссылки на учебники были бы хороши, так как я не мог найти ничего полезного по этой теме.

Спасибо за любую помощь

Обновлено и [решено]

<?php

set_time_limit(300);

// File to download
$remoteFile = $_GET['url'];

$file = fopen($remoteFile, "r");


if (!$file) {
    echo "<p>Unable to open remote file.\n";
    exit;
}
$line = '';

while (!feof ($file)) {
    $line .= fgets ($file, 4096);
}

//readfile($line);
file_put_contents('here2.mp4',  $line);

fclose($file);

?>

Ответы [ 2 ]

2 голосов
/ 13 февраля 2009

Только что попытался воспроизвести ситуацию. Губмо прав, у меня этот метод загрузки работает с Content-Type: application / octet-stream и Content-type: application / force-download заголовками

Как объяснено здесь , HTTP 410 означает, что запрашиваемый клиентом URL больше не доступен из этой системы. Это не ответ «никогда не слышал об этом», но ответ «здесь больше не живет» . Может быть, у них какая-то система против выщелачивания.

Это должно быть расследовано. Если им нужны куки - stream-context-create может помочь. Или, может быть, они проверяют реферера. Но я почти уверен, что проблема не в заголовках.

Надеюсь, это поможет.

UPD Пример кода, о котором вы спрашивали.

// file to download -- application/octet-stream
$remoteFile = 'http://dev/test/remote/send.php';
// file to download -- application/force-download
$remoteFile = 'http://chtyvo.org.ua/authors/Skriabin_Kuzma/Ya_Pobieda_i_Berlin.rtf.zip';
// file to store
$localFile = 'kuzma.zip';

$fin = fopen($remoteFile, "r");
if (!$fin) {
    die("Unable to open remote file");
}

$fout = fopen($localFile, "w");
if (!$fout) {
    die("Unable to open local file");
}

while (!feof($fin)) {
    $line = fgets($fin, 1024);
    fwrite($fout, $line, 1024);
}

fclose($fout);
fclose($fin);

То же, что и у вас.

1 голос
/ 13 февраля 2009

Вы можете сделать это так же, как загружаете удаленные файлы. Эти значения заголовка «принудительная загрузка» просто говорят пользовательским агентам, которые хотят отображать данные, чтобы загрузить их. Но для вашего скрипта это не имеет значения, так как он не может отображать данные.

...