php: принудительная загрузка с разных доменов? - PullRequest
0 голосов
/ 04 августа 2010

Интересно, вы, ребята, придумали какие-нибудь потрясающие решения для моей проблемы? нормальный способ не работает!

Что ж, я пытаюсь принудительно загрузить любой файл на любом веб-сайте с помощью следующего сценария php. Я просто передаю? P = http://www.whatever.com/images/flowers/rose.jpg на мой URL и запросы на загрузку.

    <?php
    error_reporting(E_ALL);

    if(isset($_GET['p'])) $path = $_GET['p'];
    else echo "no path set!";

    $file = $path;
    //header('Location:' . $file); //works perfect, opens the file in the browser
    //
    header("Cache-Control: no-cache");
    header("Expires: -1");
    header("Content-Type: application/octet-stream;");
    header("Content-Disposition: attachment; filename=\"" . basename($file) . "\";");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: " . filesize($file));
    echo readfile($file);
    ?> 

Однако, как я узнал сегодня, filesize () работает только с локальными файлами на моем сервере, а не с запросом http. То же самое относится и к readfile ()

Предупреждение: filesize () [function.filesize]: сбой статистики для pathtofiles… / загрузчик / d.php на линии 15

Внимание: ReadFile (sphotos.ak.fbcdn.net/hphotos-ak-snc4/hs211.snc4/...) [function.readfile]: не удалось открыть поток: HTTP-запрос не выполнен! HTTP / 1.0 403 Запрещено в pathtofiles… / загрузчик / d.php на линии 16

Интересно, есть ли творческие программисты, которые могут мне здесь помочь? Есть ли у меня шанс заставить этот сценарий работать? Я просто хочу принудительно загрузить любой файл и URL, который вы передаете.

спасибо заранее, С уважением, Мэтт

Ответы [ 3 ]

0 голосов
/ 04 августа 2010

filesize() и readfile() могут работать с некоторыми протоколами, если ваши настройки PHP позволяют.

Проблема сейчас более фундаментальная:

HTTP-запрос не выполнен! HTTP / 1.0 403 Запрещено в pathtofiles ....

помните, что при извлечении файла с использованием PHP он не имеет разрешения на вход в систему пользователя. Сценарий страховки действует как независимый браузер. Если ресурс защищен паролем, сначала вам нужно войти в свой скрипт PHP.

0 голосов
/ 04 августа 2010

Лучший способ - сохранить размер файла в вашей базе данных, если у вас есть контроль над удаленными файлами, а затем использовать функцию readfile.

Из руководства по PHP

readfile () Вы можете использоватьURL в качестве имени файла с этой функцией, если были включены обертки fopen.

0 голосов
/ 04 августа 2010

Вы не можете принудительно загрузить файл, который НЕ находится под вашим контролем (как удаленный файл). «Принудительная загрузка» говорит браузеру загрузить файл, который должен быть передан. Location: some-path говорит браузеру искать новое местоположение, таким образом прослушивая новое местоположение, а не вашу текущую страницу.

Одним из вариантов, но не оптимальным, было бы сделать локальную копию файла (на вашем сервере), а затем извлечь ее для пользователя. Если файл достаточно большой, это создаст впечатление застывшей страницы. Чтобы избежать этого, вы можете читать фрагменты удаленного файла и доставлять после каждой команды чтения.

Имейте в виду, ваш код не ограничивает возможности загрузки $file, что позволяет пользователям загружать практически любые читаемые файлы на сервере, это недостаток безопасности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...