Скачать файл с помощью CURL с URL - PullRequest
0 голосов
/ 27 октября 2019

Я пытаюсь загрузить файл, используя PHP и CURL. Если я открою ссылку в браузере, я получу файл xlsx, но с помощью PHP, когда я сохраняю файл, он не может быть открыт. Я обнаружил, что если я использую PHP для сохранения содержимого URL-адреса, файл представляет собой файл gzip, и если я сохраняю его как файл zip, я могу открыть его, и это нормально. Проблема в том, что я хочу, чтобы извлеченный файл на сервере работал, и я не могу извлечь zip-файл, потому что zip-архив говорит, что это неправильный zip-файл. Это код, который я использую:

$fp = fopen ('file.zip', 'w+');

// Here is the file we are downloading, replace spaces with %20
$ch = curl_init(str_replace(" ","%20","http:members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0"));
curl_setopt($ch, CURLOPT_TIMEOUT, 50);

//  write curl response to file
curl_setopt($ch, CURLOPT_FILE, $fp); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

//   get curl response
$ex = curl_exec($ch);
var_dump($ex); 
curl_close($ch);
fclose($fp);

$file = "images";
$zip = new ZipArchive;
$path = realpath($file);
$res = $zip->open("file.zip");

if ($res === TRUE) {
    $extract = $zip->extractTo($path);
    var_dump($extract);
    if ($extract){
    $zip->close();
    echo "WOOT! $file extracted to $path";
}else{
    echo $zip->getStatusString(); 
    echo 'not extracte';
}

} else {
    echo $zip->getStatusString(); 
    echo "Doh! I couldn't open $file";
}

Так что мой вопрос заключается в следующем. Как мне получить файл Excel с этого URL на моем хосте?

Я столько всего перепробовал, и ни один из них не работает.

Спасибо

Ответы [ 2 ]

1 голос
/ 27 октября 2019
function curl( $url=NULL, $options=NULL, $headers=false ){
    $cacert='c:/wwwroot/cacert.pem';    #EDIT THIS TO SUIT
    $vbh = fopen('php://temp', 'w+');

    session_write_close();

    $curl=curl_init();
    if( parse_url( $url,PHP_URL_SCHEME )=='https' ){
        curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, true );
        curl_setopt( $curl, CURLOPT_SSL_VERIFYHOST, 2 );
        curl_setopt( $curl, CURLOPT_CAINFO, $cacert );
    }
    curl_setopt( $curl, CURLOPT_URL,trim( $url ) );
    curl_setopt( $curl, CURLOPT_AUTOREFERER, true );
    curl_setopt( $curl, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $curl, CURLOPT_FAILONERROR, true );
    curl_setopt( $curl, CURLOPT_HEADER, false );
    curl_setopt( $curl, CURLINFO_HEADER_OUT, false );
    curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $curl, CURLOPT_BINARYTRANSFER, true );
    curl_setopt( $curl, CURLOPT_CONNECTTIMEOUT, 20 );
    curl_setopt( $curl, CURLOPT_TIMEOUT, 60 );
    curl_setopt( $curl, CURLOPT_USERAGENT, 'Mozilla/5.0' );
    curl_setopt( $curl, CURLOPT_MAXREDIRS, 10 );
    curl_setopt( $curl, CURLOPT_ENCODING, '' );
    curl_setopt( $curl, CURLOPT_VERBOSE, true );
    curl_setopt( $curl, CURLOPT_NOPROGRESS, true );
    curl_setopt( $curl, CURLOPT_STDERR, $vbh );

    if( isset( $options ) && is_array( $options ) ){
        foreach( $options as $param => $value ) curl_setopt( $curl, $param, $value );
    }
    if( $headers && is_array( $headers ) ){
        curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );
    }
    $res=(object)array(
        'response'  =>  curl_exec( $curl ),
        'info'      =>  (object)curl_getinfo( $curl ),
        'errors'    =>  curl_error( $curl )
    );
    rewind( $vbh );
    $res->verbose=stream_get_contents( $vbh );
    fclose( $vbh );
    curl_close( $curl );

    return $res;
}




/* Make the curl request and save the file */
$url='http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0';

$saveto='c:/temp/downloaded_excel_file.xlsx'; #EDIT TO SUIT

$fp=fopen( $saveto, 'w' );
$options=array( CURLOPT_FILE => $fp );
$res=curl( $url, $options );
fclose( $fp );

if( $res->info->http_code==200 ){
    echo "OK";
}

Это удачно сохраняет файл xlsx, который затем можно открыть в Excel. Размер файла, сохраненного с этим 145Kb, а не 141Kb с исходным кодом

0 голосов
/ 27 октября 2019

Вы должны упомянуть кодировку gzip (как CURLOPT_ENCODING), тогда вам не нужно извлекать файл (и загруженный файл можно открыть напрямую):

$url = 'http://members.tsetmc.com/tsev2/excel/MarketWatchPlus.aspx?d=0';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_ENCODING, 'gzip, deflate');

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close($ch);

file_put_contents('test.xlsx', $result);
...