下载远程文件

时间:2010-04-25 18:25:12

标签: php codeigniter

我有一个将在链接中传递的函数。该链接指向远程图像。我以为我可以使用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 个答案:

答案 0 :(得分:3)

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

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

您也可以发送Accept: image/*来获取任何类型的图片。

干杯。

答案 1 :(得分:0)

您应始终使用Content-Type响应标头来确定收到的数据类型。从那里你可以设置正确的扩展名。网址没有扩展名,您不应该在一段时间后依赖任何内容。

答案 2 :(得分:0)

您将无法使用fsock / fread甚至file_get_contents读取标头。这些都隐藏在后台,并在检索完成时丢弃。您必须使用CURL函数并使用该函数设置正确的HTTP GET会话,您可以从中检索传输的完整详细信息。