我正在尝试使用服务器端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;
}
答案 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。