PHP filesize()适用于除一个文件外的所有文件,会出现stat失败错误

7
我正在编写一个PHP页面,通过抓取现有的HTML页面生成播客源。一切都很顺利,但我的其中一个MP3文件出现了“filesize():stat failed”错误。据我所知,该文件没有损坏,并且能够正常播放。我也已经重新上传了该文件到服务器。它的文件大小处于所有文件大小的中等范围内,因此我不认为文件过大。由于其他每个文件都返回文件大小,我认为问题在于MP3文件,而不是我的服务器配置。是否还应该检查其他内容?
下面是代码的相关部分:
$i = 1; //skipping header row on table
do {
    $tr = $table->find('tr', $i);

    $date = $tr->find('div', 0)->plaintext;
    $datetime = new DateTime($date);
    $speaker = $tr->find('div', 1)->plaintext;
    $title = $tr->find('div', 2)->plaintext;
    $url = $tr->find('div', 3)->find('a', 0)->href;
    $fullurl = "http://domain.org/resources/".$url;
    $filesize = filesize($url); //<---works on every file except one

    echo "<item><title>".$title."</title>\n";
    echo "<description>".$title." - ".$datetime->format('D, M jS, Y')." - ".$speaker."</description>\n";
    echo "<itunes:author>".$speaker."</itunes:author>\n";
    echo "<enclosure url=\"".$fullurl."\" length=\"".$filesize."\" type=\"audio/mpeg\"/>\n";
    echo "<guid isPermaLink=\"true\">".$fullurl."</guid>\n";
    echo "<pubDate>".$datetime->format('r')."</pubDate>\n";
    echo "<itunes:explicit>clean</itunes:explicit></item>\n\n";

    $i++;
}while ($table->find('tr', $i) != NULL);

根据要求:(人们会指出编辑吗?这是我在这里的第一个问题..)

文件名为“12-20-09_AM_Podcast.mp3”,遵循其他文件的命名约定,所有文件的权限均为644。完整的错误代码为

<b>Warning</b>:  filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for audio/12-20-09_AM_Podcast.mp3 in <b>/homepages/1/d106955786/htdocs/victory/resources/podcast1.php</b> on line <b>45</b><br />

文件名中是否包含任何非ASCII字符或特殊字符()[]?此外,当stat失败时,通常会有错误代码吗? - Pekka
1
由于这是一个简单的函数调用失败,您必须显示实际的文件名(可能还包括文件的权限)。 - Mike Anchor
1
请检查您的Web服务器是否具有访问它所需的足够权限。 - zneak
1个回答

4
由于某种原因,domain.org上的网络服务器未返回Content-Length头字段,导致filesize()无法正常工作。
如果文件存储在本地,则可以使用filesize()函数检查本地文件副本。否则,您无法解决这个问题,因为这是domain.org的网络服务器的问题。但是您可以通过先将文件下载到本地,然后再检查filesize()函数来解决此问题,但这会严重降低页面加载速度。
如果文件存储在本地,请再次检查您的文件名或锚点。您可能拼写错误了一个或两个,而Apache mod_speling模块正在为您纠正它们。

1
我实际上正在使用本地文件(所有文件都是本地的,包括我正在抓取的文件)。$fullurl语法仅用于RSS源。因为其余文件都可以正常工作,所以我是否正确地认为这不是服务器问题? - Nicholas Sideras
正确。查看file_exists是否返回true。可能是文件大小写问题,这不会影响Apache,因为有mod_speling - Andrew Moore
就是这样。原来文件名为“12-20-09_AM_Podacst.mp3”(请注意“podcast”中的字母'a'和'c'被交换了),但mod_spelling正在修复所有指向它的链接。哎呀,我一定看了那个文件名100遍都没注意到。谢谢! - Nicholas Sideras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接