2012-08-07 148 views
5

我想要下载远程文件并将其放在我的服务器目录中,并使用原来的文件名。我试图使用file_get_contents($url)无法将远程文件名获取到file_get_contents(),然后存储文件

问题是文件名不包含在$url中,它就像:www.domain.com?download=1726。这个URL给我,例如:myfile.exe,所以我想用file_put_contents('mydir/myfile.exe');

我如何检索文件名?我在下载之前试过get_headers(),但我只有文件大小,修改日期和其他信息,文件名缺失。

+0

看一看卷曲它应该涵盖你所需要的http:// php.net/manual/en/book.curl.php – Waygood 2012-08-07 09:17:39

+0

看看这个问题的cURL文件名http://stackoverflow.com/questions/1750055/with-php-curl-get-filename-from-file-header – Waygood 2012-08-07 09:21:57

回答

0

file_get_contents()如果该文件已被Web服务器预解析,则HTTP包装器不会直接下载该文件。

看看下面的例子:如果你在删除网页(example.com/foobar.php)调用file_get_contents(),你会不会与源代码foobar.php呈现,但example.com Web服务器是如何解析PHP文件。所以你只能够检索生成的HTML输出。

如果文件名不存在于URL中,并且您无法从任何地方获取它,那么您就处于死路一条。数据不能只是从超越数据领域召唤

其他解决方案,我只能建议使用cURL库(它是用来从你的服务器处理查询(因为它是一个客户端)到其他服务器上使用URL,故名cient URL)或file sockets 。这里是another question's answer on Stack Overflow,它描述了如何使用cURL获取文件名。

此外,您可能会尝试联系domain.com的管理员/维护人员/网站管理员团队,询问他们是否有公开可用的API来获取文件名和其他元数据。

+0

谢谢你快速回复。我会尝试卷曲。但我仍然想知道,浏览器如何知道文件名?当我把这个URL放在浏览器中时,我得到了一个真实文件名的提示保存窗口。因此,当我使用之前: ini_set('user_agent','Mozilla/5.0(X11; U; Linux i686; en-US; rv:1.9.0.16)Gecko/2009121601 Ubuntu/9.04(jaunty)Firefox/3.0。16' ); 我以为我就像一个浏览器:) – Peter222 2012-08-07 09:40:20

+0

[RFC 2183](http://www.ietf.org/rfc/rfc2183.txt)描述了Content-Disposition:标题,它可以包含一个'filename'指令。浏览器解析标题的这部分,并从中获取各种元数据。检查我在我的答案中链接为相关的答案,它描述了一种方法,如何使用PHP(和cURL)检索此头文件。 – Whisperity 2012-08-07 09:43:21

+0

我测试了上面的所有例子。没有成功。我尝试完整的这个例子类:http://stackoverflow.com/questions/6177661/how-do-download-a-file-with-curl,但不能通过cURL获得原始文件名。即使URL包含文件名也是如此。有人可以根据任何公共文件(JPG或其他)进行工作示例。只需下载远程并使用相同名称在本地保存即可。我将非常感激。谷歌搜索2天,没有想法:( – Peter222 2012-08-08 18:19:22

7

我解决了另一种方式。我发现如果url标头中没有内容处置,则URL存在文件名。因此,此代码适用于任何类型的URL(不需要cURL):

$url = "http://www.example.com/download.php?id=123"; 
// $url = "http://www.example.com/myfile.exe?par1=xxx"; 
$content = get_headers($url,1); 
$content = array_change_key_case($content, CASE_LOWER); 

    // by header 
if ($content['content-disposition']) { 
    $tmp_name = explode('=', $content['content-disposition']); 
    if ($tmp_name[1]) $realfilename = trim($tmp_name[1],'";\''); 
} else 

// by URL Basename 
{ 
    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    $realfilename = basename($stripped_url); 

} 

它的工作原理! :)

+0

+1。这是非常有用的,但你为什么不接受它作为答案? 这个代码有问题吗? – aliqandil 2014-03-17 15:45:34

5

基于Peter222的代码我写了一个函数来获取文件名。 可以使用$ http_response_header变量:

function get_real_filename($headers,$url) 
{ 
    foreach($headers as $header) 
    { 
     if (strpos(strtolower($header),'content-disposition') !== false) 
     { 
      $tmp_name = explode('=', $header); 
      if ($tmp_name[1]) return trim($tmp_name[1],'";\''); 
     } 
    } 

    $stripped_url = preg_replace('/\\?.*/', '', $url); 
    return basename($stripped_url); 
} 

用法:($ http_response_header会的file_get_contents填写())

$url = 'http://example.com/test.zip'; 
$myfile = file_get_contents($url); 
$filename = get_real_filename($http_response_header,$url) 
相关问题