7 Stimmen

curl holt entfernte Datei und erzwingt gleichzeitig den Download

Ich versuche, eine Remote-Datei abzurufen und gleichzeitig den Download für den Benutzer zu erzwingen. Ich kann den Code nicht einfügen, der Code ist zu lang. aber die Curl-Funktion funktioniert, aber das Problem ist, dass es nichts ausgibt, bis es die Remote-Datei zuerst bekommt, dann lädt es zwangsweise zum Benutzer herunter.

Ich verwende dies, um curl zu sagen, dass es einen Rückruf zurückgeben soll

curl_setopt($ch, CURLOPT_READFUNCTION, 'readCallback');

In meiner readCallback-Funktion mache ich jetzt folgendes:

function readCallback($curl, $stream, $maxRead){
    $read = fgets($stream, $maxRead);
    echo $read;
    return $read;
}

aber es wird nichts zurückgegeben, sondern nur gewartet, bis das Abrufen der entfernten Datei beendet ist.

9voto

Lawrence Cherone Punkte 44625

Versuchen Sie dies, es wird curl verwenden, um die Gesamtgröße der Datei zu erhalten und dann Teilstücke der Datei herunterzuladen, die dem Benutzer als Proxy zur Verfügung gestellt werden, so dass es keine warten für curl, um es zuerst herunterzuladen, ich habe dies mit einem avi, mp4, mp3 und einer exe getestet, ich hoffe es hilft:

<?php
$file = 'http://example.com/somefile.mp3';
download($file,2000);

/*
Set Headers
Get total size of file
Then loop through the total size incrementing a chunck size
*/
function download($file,$chunks){
    set_time_limit(0);
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-disposition: attachment; filename='.basename($file));
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Expires: 0');
    header('Pragma: public');
    $size = get_size($file);
    header('Content-Length: '.$size);

    $i = 0;
    while($i<=$size){
        //Output the chunk
        get_chunk($file,(($i==0)?$i:$i+1),((($i+$chunks)>$size)?$size:$i+$chunks));
        $i = ($i+$chunks);
    }

}

//Callback function for CURLOPT_WRITEFUNCTION, This is what prints the chunk
function chunk($ch, $str) {
    print($str);
    return strlen($str);
}

//Function to get a range of bytes from the remote file
function get_chunk($file,$start,$end){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $file);
    curl_setopt($ch, CURLOPT_RANGE, $start.'-'.$end);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);
    curl_setopt($ch, CURLOPT_WRITEFUNCTION, 'chunk');
    $result = curl_exec($ch);
    curl_close($ch);
}

//Get total size of file
function get_size($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_exec($ch);
    $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
    return intval($size);
}
?>

2voto

Michael Punkte 2299

Versuchen Sie, Locken so zu verwenden:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPGET, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$result = curl_exec($ch);

$msg = new HttpMessage($result);
return $msg->getBody();

Der Rückgabewert ist dann der Inhalt der angeforderten Datei, die Sie dann ausgeben können. Ein Rückruf ist also nicht erforderlich. HTTPMessage-Dokumente .

0voto

Sergio A. Kessler Punkte 159

Wie man groß (8 GB) Remote-Datei und erzwingen Sie den Download zur gleichen Zeit, ohne dass Ihr Server dabei abstürzt:

<?php

$url = 'http://www.example.com/bigfile.mp4';

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($url).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

readfile($url);

el readfile() Funktion liest den Stream in Chunks und gibt ihn auf der Ausgabe aus, so dass sie nicht viel Speicher benötigt...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X