Загрузка загрузок с помощью PHP и cURL - PullRequest
1 голос
/ 24 мая 2011

Я пишу скрипт, который обслуживает загрузку пользователей с помощью моей премиум-учетной записи Megaupload. Это метод, который я использую для загрузки файлов Megaupload:

public function download_file($link)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $link);
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies/megaupload.txt");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    return curl_exec($ch);
    curl_close($ch);
}

И вот как он вызывается в index.php:

readfile($megaupload->download_file("http://www.megaupload.com/?d=PXNDZQHM"));

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

Но очевидно, что решение выше не будет работать. Я получаю эту ошибку:

Warning: readfile() [function.readfile]: Filename cannot be empty in C:\xampp\htdocs\index.php on line 8

Мне нужно использовать cURL для этого, потому что мне нужно запросить загрузку с помощью файла cookie (/cookies/megaupload.txt).

Кто-нибудь может придумать, как это сделать? Приветствия.

Ответы [ 3 ]

2 голосов
/ 24 мая 2011

Использование метода, который вы пытаетесь использовать, не будет работать (или не будет работать так, как вы думаете).

Curl будет блокироваться, пока файл не будет полностью загружен.

Вынеобходимо создать собственный протокол и обработать событие записи в классе.

Вот ссылка на предыдущее обсуждение, где кто-то проделал очень хорошую работу, объясняя его.В основном вам нужно обработать файл в управляемых чанках и передать их в браузер клиента: Манипулировать строкой длиной 30 миллионов символов

Вы также можете попробовать использовать сокеты, но вы 'Нам придется поработать над вашим кодом cookie, потому что curl многое из этого делает за кулисами.

1 голос
/ 24 мая 2011

Да, именно так, как он говорит, readfile ожидает имя файла, и вы даете ему строку результата скручивания. Просто используйте echo после установки правильных заголовков :

echo $megaupload->download_file("http://www.megaupload.com/?d=PXNDZQHM");

РЕДАКТИРОВАТЬ : Также вам нужно выполнить некоторые базовые проверки, чтобы вы получили что-то обратно:

public function download_file($link)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $link);
    curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__) . "/cookies/megaupload.txt");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);
    // close before you return
    curl_close($ch);
    return $result;
}

Тогда:

$filecontents = $megaupload->download_file("http://www.megaupload.com/?d=PXNDZQHM");
if($filecontents) {
  echo $filecontents;
}
else {
  die("Yikes, nothing here!");
}
0 голосов
/ 23 ноября 2011

Алгоритм для этого

  1. получить прямой URL-адрес нужного файла
  2. попросите ваш скрипт подождать 45 секунд (не участник) или 25 секунд (участник)
    • если пользователь является участником, сначала пользователь должен войти в систему
  3. скачать файл
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...