加载远程存储文件的PHP方法

时间:2014-05-25 23:01:52

标签: php curl file-get-contents get-headers

我正在使用SmartFile来存储用户提交的文件。要在网站上显示图像文件,我只能链接到它们,但如果文件丢失,我无法选择显示默认图像。或者防止热链接。或者设置浏览器缓存等。

他们的API被限制为每分钟180个请求。因此,在繁忙的网站上显示图像并不好。

我已尝试使用get_headers检查预期的文件是否存在,然后file_get_contents,如果确实存在,但这非常缓慢且效率低下。只使用file_get_contents而不使用get_headers首先非常慢!

这里最好的选择是什么?我还没有尝试使用curl。我想我只能通过一个请求来获取标题和文件,但由于file_get_contents很慢,我想卷曲不会更快。

2 个答案:

答案 0 :(得分:0)

您可以通过JavaScript在浏览器中加载和检查。因此,您的应用程序只是将链接传递给文件,用户将看到 loading 图像,而JavaScript将检查图像是否存在。

使用jQuery的示例:

<img src="loading.gif">
<script>
    $.ajax({
        type: 'HEAD',
        url: 'http://example.com/image.jpg',
        success: function() {
            $('img').attr('src','http://example.com/image.jpg');
        },
        error: function() {

        }
    });
</script>

如果您不需要隐藏图片路径,则无需使用 file_get_contents 加载图片。

您还可以使用一些数据库表来缓存图像地址。如果链接仍然有效或已损坏,请每小时检查一次。如果它被破坏,您将在该数据库中将该图像的URL更改为 missing.jpg

您还可以考虑从 smartfile 迁移到DropBox或其他服务。

答案 1 :(得分:0)

尝试从其他网站抓取图片,是的,使用file_get_content

<?php 

if(!isset($_GET['read'])){
 $url = "http://mangaku.web.id/baca-komik-naruto-terbaru-bahasa-indonesia/"; 
 $input = @file_get_contents($url) or die("Could not access file: $url");
 $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>"; 
 if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
 foreach($matches as $match) {
     if (strpos($match[2],'chapter')!== false OR strpos($match[3],'naruto-chapter')!== false) {
    echo "<a href='http://localhost/mangaku.php?read=".$match[2]."'>".$match[3]."</a><br>";
}
 } 
 }
}

 if(isset($_GET['read'])){
 $url = $_GET['read']; 
 $input = @file_get_contents($url) or die("Could not access file: $url");
 $regexp = "<a\s[^>]*href=(\"??)([^\" >]*?)\\1[^>]*>(.*)<\/a>"; 
 if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
 foreach($matches as $match) {
     if (strpos($match[2],'bp.blogspot.com') !== false) {
  echo "<center><image src='".$match[2]."'></center><br>";
  //echo $match[2]."<br>";
}
 } 
 }
}
?>