【问题标题】:Warning: filesize(): stat failed for..error警告:filesize(): stat failed for..error
【发布时间】:2018-01-21 05:38:06
【问题描述】:

我有这个代码:

$album_name = $row['album'];
    if(!file_exists("cdcovers/$album_name.jpg") && filesize($album_name) > 5){
//gravar as imagens
$imageString = file_get_contents(LastFMArtwork::getArtwork($row['artist'], $row['album'], true, "large"));
$save = file_put_contents('/home/link/public_html/cdcovers/'.$row['album'].'.jpg',$imageString);
}   

但是如果图像不存在,我会给出错误(警告:filesize(): stat failed for...), 我的想法是,如果文件存在并且大于 5kb,那么如果它是 4kb 或低于保存图像,则什么也不做,即使文件存在 0kb。

【问题讨论】:

    标签: php


    【解决方案1】:

    根据我的理解,如果图像不存在,您希望创建图像,如果图像小于 5kb,则更新图像。

    简而言之,filesize 将产生警告,如果你给它一个不存在但原始代码还有一些问题的文件:

    1. 条件块错误。函数filesize 以字节为单位返回大小,5kb 约为 5,000 字节。
    2. 还使用了错误的比较运算符。应该使用小于运算符< 而不是大于运算符>
    3. 当文件不存在时,代码会尝试检查文件的大小。
    4. 您在条件块中引用了不同的文件路径。

    我修改了示例代码以将图像的绝对路径存储在变量中并在需要时引用它,修复了字节比较并更新了条件块要求以防止出现filesize 警告。

    请查看下面的更新代码:

    $albumCoverImg = '/home/link/public_html/cdcovers/' . $row['album'] . '.jpg';
    
    $minSize   = 5 * 1000; // 5KB
    $fileExist = is_file($albumCoverImg);
    
    if (!$fileExist || ($fileExist && filesize($albumCoverImg) < $minSize)) {
        //gravar as imagens
        $imageString = file_get_contents(LastFMArtwork::getArtwork($row['artist'], $row['album'], true, "large"));
        $save        = file_put_contents($albumCoverImg, $imageString);
    }
    

    【讨论】:

      【解决方案2】:

      您必须先检查文件是否存在才能检查其大小。

      如果"cdcovers/$album_name.jpg"$album_name 是不同的文件,您还必须检查第二个。

      if (!file_exists("cdcovers/$album_name.jpg") && 
          file_exists($album_name) && 
          filesize($album_name) > 5) {
      

      如果文件相同,则为错误(缺少文件夹和文件扩展名)。

      另外,您使用绝对路径保存文件:'/home/link/public_html/cdcovers/'.$row['album'].'.jpg'。它可能与"cdcovers/$album_name.jpg" 不同(取决于当前文件夹的脚本执行)。您可以使用绝对路径,__dir__ 常量相对于您当前的文件夹。

      您可以使用变量来存储文件名并通过多次写入来限制错误:

      $filename = '/home/link/public_html/cdcovers/'.$row['album'].'.jpg' ;
      if (!file_exists($filename) || 
          (file_exists($filename) && filesize($filename) < 5000)) {
          file_put_contents($filename, ...); 
      }
      

      还请注意,filesize() 以字节为单位返回大小,而不是以 Kb 为单位。

      【讨论】:

      • 感谢您的回答和时间,但下面的答案更重要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-20
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多