首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在foreach循环中多次使用fopen、fwrite

在foreach循环中多次使用fopen、fwrite
EN

Stack Overflow用户
提问于 2011-03-07 06:21:07
回答 4查看 3.6K关注 0票数 0

我想使用fopen,fwrite将文件从外部服务器保存到我的服务器上的文件夹中。

首先加载来自外部站点的页面,并扫描任何图像链接。则该列表从an被发送到fwrite函数。这些文件已经创建,但它们不是有效的jpg文件,在浏览器中查看它们时,它们在我的服务器上的路径似乎是写入它们的。

代码如下:

代码语言:javascript
运行
复制
//read the file
$data = file_get_contents("http://foo.html");

   //scan content for jpg links
preg_match_all('/src=("[^"]*.jpg)/i', $data, $result); 

//save img function
function save_image($inPath,$outPath)
{
    $in=    fopen($inPath, "rb");
    $out=   fopen($outPath, "wb");
    while ($chunk = fread($in,8192))
    {
        fwrite($out, $chunk, 8192);
    }
    fclose($in);
    fclose($out);
}

//output each img link from array
foreach ($result[1] as $imgurl) {
    echo "$imgurl<br />\n";
    $imgn = (basename ($imgurl));
    echo "$imgn<br />\n";
    save_image($imgurl, $imgn);
}

如果我写出一个列表,save_image函数就会起作用:

代码语言:javascript
运行
复制
save_image('http://foo.html', foo1.jpg);
save_image('http://foo.html', foo1.jpg);

我希望我能够从数组中的匹配项循环列表。

谢谢你的关注。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-07 07:17:15

你的脚本有两个问题。首先,引号包含在外部图像URL中。要解决此问题,您的正则表达式应为:

代码语言:javascript
运行
复制
/src="([^"]*.jpg)/i

其次,图像URL可能不是绝对的(不包括http://和文件路径)。把这个放在foreach的开头来解决这个问题:

代码语言:javascript
运行
复制
$url = 'http://foo.html';
# If the image is absolute.
if(substr($imgurl, 0, 7) == 'http://' || substr($imgurl, 0, 8) == 'https://')
{
  $url = '';
}
# If the image URL starts with /, it goes from the website's root.
elseif(substr($imgurl, 0, 1) == '/')
{
  # Repeat until only http:// and the domain remain.
  while(substr_count($url, '/') != 2)
  {
    $url = dirname($url);
  }
}
# If only http:// and a domain without a trailing slash.
elseif(substr_count($imgurl, '/') == 2)
{
  $url .= '/';
}
# If the web page has an extension, find the directory name.
elseif(strrpos($url, '.') > strrpos($url, '/'))
{
  $url = dirname($url);
}
$imgurl = $url. $imgurl;
票数 1
EN

Stack Overflow用户

发布于 2011-03-07 06:46:50

不能保证fopen能正常工作。你应该检查任何东西的返回值,它们可能会在错误时返回一些不同的东西...

fopen() -成功时返回文件指针资源,错误时返回FALSE。

事实上,所有的文件函数在出错时都会返回false。

要找出它的故障所在,我建议使用调试器,或者在save_image函数中输出一些信息。即$inPath和$outPath是什么,因此您可以验证它们是否被传递了您所期望的内容。

票数 0
EN

Stack Overflow用户

发布于 2011-03-07 06:47:40

我看到的主要问题是正则表达式可能无法捕获完整的http://路径。大多数站点都不使用此选项,而是使用相对路径。您应该在检查中编写代码,如果不存在,则添加它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5213864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档