0

我正在使用以下代码将远程文件上传到我的服务器。在提供直接下载链接的情况下效果很好,但最近我注意到很少有网站提供 mysql 链接作为下载链接,当我们单击该链接时,文件开始下载到我的电脑。但即使在该页面的 html 源代码中,它也不会显示直接链接。

这是我的代码:

 <form method="post">
 <input name="url" size="50" />
 <input name="submit" type="submit" />
 </form>
 <?php
 if (!isset($_POST['submit'])) die();
 $destination_folder = 'mydownloads/';
 $url = $_POST['url'];
 $newfname = $destination_folder . basename($url);
 $file = fopen ($url, "rb");
 if ($file) {
 $newf = fopen ($newfname, "wb");

  if ($newf)
 while(!feof($file)) {
 fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
 }
 }

 if ($file) {
  fclose($file);
 }

if ($newf) {
fclose($newf);
}

?>

它适用于所有直接下载链接的链接,例如,如果我提供 http://priceinindia.org/muzicpc/48.php?id=415508链接,它将上传音乐文件,但文件名将是 48。 php?id=415508 但实际的 mp3 文件存储在
http://lq.mzc.in/data48-2/37202/Appy_Budday_(Videshi)-Santokh_Singh(www.Mzc.in).mp3

因此,如果我可以获得实际的目标网址,则名称将是 Appy_Budday_(Videshi)-Santokh_Singh(www.Mzc.in).mp3

所以我想获得实际的下载网址。

4

2 回答 2

1

您应该为此使用 Curl 库。http://php.net/manual/en/book.curl.php

在关闭连接之前,在手册(在该链接上)中提供了如何使用 curl 的示例,请调用 curl_getinfo(http://php.net/manual/en/function.curl-getinfo.php)并具体获取CURLINFO_EFFECTIVE_URL 这就是你想要的。

<?php
// Create a curl handle
$ch = curl_init('http://www.yahoo.com/');

// Execute
$fileData = curl_exec($ch);

// Check if any error occured
if(!curl_errno($ch)) {
    $effectiveURL = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
}

// Close handle
curl_close($ch);
?> 

(您也可以使用 curl 直接写入文件 - 使用 CURLOPT_FILE 选项。也在手册中)

于 2012-09-19T07:19:20.700 回答
0

问题是原始 URL 正在重定向。您想捕获它被重定向到的 URL,尝试使用标头,然后获取 basename($redirect_url) 作为文件名。

为使用 CURL 的 Robbie +1。

如果你运行(从命令行)

[username@localhost ~]$ curl http://priceinindia.org/muzicpc/48.php?id=415508 -I
HTTP/1.1 302 Moved Temporarily
Server: nginx/1.0.10
Date: Wed, 19 Sep 2012 07:31:18 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.3.10
Location: http://lq.mzc.in/data48-2/37202/Appy_Budday_(Videshi)-Santokh_Singh(www.Mzc.in).mp3

您可以看到这里的位置标头是新的 url。

在php中尝试类似

$ch = curl_init('http://priceinindia.org/muzicpc/48.php?id=415508'); 
curl_setopt($ch, CURLOPT_HEADER, 1); // return header
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // dont redirect 
$c = curl_exec($ch); //execute
echo curl_getinfo($ch, CURLINFO_HTTP_CODE); // will echo http code.  302 for temp move
echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // url being redirected to

您想找到标题的位置部分。不确定设置我确定。

编辑 3..或 4?是的,我明白发生了什么。您实际上想要跟随位置 url 然后回显有效 url 而无需下载文件。尝试。

$ch = curl_init('http://priceinindia.org/muzicpc/48.php?id=415508');
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$c = curl_exec($ch); //execute
echo curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); // url being redirected to

当我运行它时,我的输出是

[username@localhost ~]$ php test.php
http://lq.mzc.in/data48-2/37202/Appy_Budday_(Videshi)-Santokh_Singh(www.Mzc.in).mp3
于 2012-09-19T06:41:13.000 回答