How can I get file name from header using curl in

2019-04-15 04:35发布

how can i determine the file name in header when i get with php. lock at this:

<?php
/*
This is usefull when you are downloading big files, as it
will prevent time out of the script :
*/
set_time_limit(0);
ini_set('display_errors',true);//Just in case we get some errors, let us know....

$fp = fopen (dirname(__FILE__) . '/tempfile', 'w+');//This is the file where we save the information
$ch = curl_init('http://www.example.com/getfile.php?id=4456'); // Here is the file we are downloading

/*
    the server get me an header 'Content-Disposition: attachment; filename="myfile.pdf"'

    i want get 'myfile.pdf' from headers. how can i get it ?
*/

$fileNameFromHeader = '?????????????';

curl_setopt($ch, CURLOPT_TIMEOUT, 50);
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_exec($ch);
curl_close($ch);
fclose($fp);

// rename file
rename(dirname(__FILE__) . '/tempfile', dirname(__FILE__) . $fileNameFromHeader);

2条回答
Melony?
2楼-- · 2019-04-15 04:56

I would use the function Byron mentioned. However, if you just want the fileNameFromHeader, I would include this in the readHeader function:

function readHeader($ch, $header)
{
    global $responseHeaders;
    $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
    $responseHeaders[$url][] = $header;

    // $url = 'http://stackoverflow.com/questions/4091203/how-can-i-get-file-name-from-header-using-curl-in-php'; 
    $params = explode('/', $url);
    $fileNameFromHeader = $params[count($params) - 1];

    //return strlen($header);
    return $fileNameFromHeader;
}
查看更多
Animai°情兽
3楼-- · 2019-04-15 05:01

Create a callback that reads headers, and parse them yourself. Something like:

function readHeader($ch, $header)
{
          global $responseHeaders;
          $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
          $responseHeaders[$url][] = $header;
      return strlen($header);
}

 ... curl stuff ...
 // if you need to call a class method use this:
 // curl_setopt($ch, CURLOPT_HEADERFUNCTION, array(&$this,'readHeader'));
 // for a non class method use this
 curl_setopt($ch, CURLOPT_HEADERFUNCTION, 'readHeader');
 $result = curl_exec($ch);

 // all headers are now in $responseHeaders
查看更多
登录 后发表回答