2010-04-25 82 views
1

我有一个函数将在链接中传递。链接是到远程图像。我想我可以在URL中使用该文件的扩展名来确定图像的类型,但是一些URL在URL中不会有扩展名。他们可能只是将标题推送到浏览器,因此我没有从URL解析的扩展名。下载远程文件

如何测试URL是否具有扩展名,如果不是则读取标题以确定文件类型?

我在这里复杂的东西吗?有没有更简单的方法来做到这一点?我正在使用Codeigniter,也许有内置的东西来做到这一点?

我真正想要做的是从URL下载 图像与正确的 扩展。

这是我到目前为止。

function get_image($image_link){ 

    $remoteFile = $image_link; 

    $ext = ''; //some URLs might not have an extension 

    $file = fopen($remoteFile, "r"); 


    if (!$file) { 

     return false; 

    }else{ 

     $line = ''; 

     while (!feof ($file)) { 

      $line .= fgets ($file, 4096); 

     } 

     $file_name = time().$ext; 

     file_put_contents($file_name, $line); 

    } 

    fclose($file); 

} 

感谢所有的帮助

回答

3

你永远不想打开文件扩展名。例如,不是所有的ASCII文本文件都会有“.txt”,然后总是有趣的“.jpg”与“.jpeg”。相反,请打开Web服务器响应的Content-Type标头。 (见http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.17)。

某些网络服务器也将遵守Accept标头(请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1)。所以,如果你知道你只想要PNG图像文件,那么发送Accept: image/png。如果服务器尊重它,那么它的响应将比通过网络连接发送整个不需要的文件小得多。但是,因为并非所有的Web服务器都能很好地完成这项工作(如果有的话),请确保您仍然打开Content-Type响应标头。这只是一个带宽节省的事情。

你也可以发送Accept: image/*得到任何类型的图像。

干杯。

0

你应该总是使用的Content-Type响应报头,以确定接收到的数据的类型。从中你可以设置正确的扩展名。网址没有扩展名,在这段时间之后,您不应该依赖任何内容。

0

您将无法使用fsock/fread甚至file_get_contents读取标头。这些都隐藏在背景中,并在检索结束时丢弃。您必须使用CURL函数并使用该函数设置适当的HTTP GET会话,您可以从中检索传输的全部详细信息。