无法使用PHP将远程mp3文件下载到服务器

时间:2015-12-26 07:24:40

标签: php curl download file-get-contents

我正在尝试使用服务器端PHP将语音文件(大约8kb)下载到服务器。从许多讨论这个问题的线索中获得提示,我尝试了以下内容:

$numwrd = str_word_count($wrd);
    if($numwrd == 1){
        $html = file_get_html("http://www.dictionaryapi.com/api/v1/references/spanish/xml/" . rawurlencode($wrd) . "?key=" . rawurlencode('6d4d41f9-c28f-4544-9bb3-1b4708d1a4d1'));
        $sn = $html->find('sound');
        if($sn[0] != ""){
            $foldername = findsub($sn[0]->plaintext);
            $filename = explode(".", $sn[0], 2)[0];
            $audiofn = $foldername . $filename . '.mp3';
            $soundurl = 'http://media.merriam-webster.com/audio/prons/es/me/mp3/' . $foldername . '/' . $filename . '.mp3';
            $path = 'amit.mp3';
            $headers = getHeaders($soundurl);
            if ($headers['http_code'] === 200 and $headers['download_content_length'] < 1024*1024) {
              if (download($url, $path)){
                return $audiofn . " " . $soundurl; 
              }
            }
        }
        else { return "not found"; }
    }
    else { return "not found"; }
function getHeaders($url)
{
  $ch = curl_init($url);
  curl_setopt( $ch, CURLOPT_NOBODY, true );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
  curl_setopt( $ch, CURLOPT_HEADER, false );
  curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
  curl_setopt( $ch, CURLOPT_MAXREDIRS, 3 );
  curl_exec( $ch );
  $headers = curl_getinfo( $ch );
  curl_close( $ch );

  return $headers;
}
function download($url, $path)
{
  # open file to write
  $fp = fopen ($path, 'w+');
  # start curl
  $ch = curl_init();
  curl_setopt( $ch, CURLOPT_URL, $url );
  # set return transfer to false
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, false );
  curl_setopt( $ch, CURLOPT_BINARYTRANSFER, true );
  curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );
  # increase timeout to download big file
  curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10 );
  # write data to local file
  curl_setopt( $ch, CURLOPT_FILE, $fp );
  # execute curl
  curl_exec( $ch );
  # close curl
  curl_close( $ch );
  # close local file
  fclose( $fp );

  if (filesize($path) > 0) return true;
}

这没有用,所以我再次尝试使用file_get_contents。但是,此方法仅创建文件但零字节。 $foldername$filename$audiofn$soundurl中的值正在正确评估,并且所有这些变量都已经过测试。我可以通过浏览到URL,右键单击浏览器,然后单击download file as...来手动下载文件。什么可能破坏我的PHP?

P.S。:我刚尝试使用cURL修改过的函数,这也失败了:

function down($url, $target){//feeding it $soundurl and $path values
    set_time_limit(0);
    $file = fopen(dirname(__FILE__) . $target, 'w+');
    $curl = curl_init($url);
    curl_setopt_array($curl, [
        CURLOPT_URL            => $url,
        CURLOPT_BINARYTRANSFER => 1,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_FILE           => $file,
        CURLOPT_TIMEOUT        => 50,
        CURLOPT_USERAGENT      => 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'
    ]);
    $response = curl_exec($curl);

    if($response === false) {
        throw new \Exception('Curl error: ' . curl_error($curl));
    }
    $response;
}

1 个答案:

答案 0 :(得分:0)

终于搞定了!这就是解决它的问题(第7行):

$filename = explode(".", $sn[0]->plaintext, 2)[0];

我必须添加 - &gt;明文属性的原因是因为没有它,返回到$ 文件名的值是xml标记而不是内部文本那个标签。由于以下代码行将此值作为输入,因此这会破坏要下载的URL:

$soundurl = 'http://media.merriam-webster.com/audio/prons/es/me/mp3/' . $foldername . '/' . $filename . '.mp3';

现在文件下载成功,因为正确形成了URL。