好吧,这是我以前从未见过的问题。
我正在尝试使用PHP的fopen()
和feof()
流式传输FTP文件,以便将其从一台服务器复制到我自己的服务器。当使用普通的http://
URL时,此操作效果良好。然而,当使用ftp://
协议时,我收到以下错误:
fopen(ftp://.../streaming/planted2.mp4) [0function.fopen0]: failed to open stream: FTP server reports 550 /streaming/planted2.mp4: not a plain file.
请记住,我已经确认URL是正确的。
如果我把它弹出到浏览器的搜索栏,它总是能正确加载。
在这个错误之后,任何在包装器上使用feof()
或fread()
的尝试都会导致一个错误,抱怨相应的函数需要一个资源,但却提供了一个布尔值。如果fopen()
没有失败,情况就不会如此。
由于文件相当大(有时几GB),因此必须进行流式传输。此外,由于服务器的配置,我需要一种方法来循环遍历每个块,以便缓冲一些输出。如果我不这样做,服务器就会挂断。这对Rackspace来说是一个奇怪的配置。这就是我使用feof()
的原因。
所以,事不宜迟,我的问题是:550错误意味着什么,什么是"普通文件"?如果我试图从中下载的服务器的配置有问题,考虑到我的限制,我有什么选择?
编辑
我已经确定这是服务器问题。然而,这个问题仍然没有得到解决。
我联系了我的老板和我们的服务器管理员,服务器管理员告诉我在另一台基于Windows的服务器上测试,而不是在我玩的基于Linux的服务器上。我的脚本适用于Windows服务器,所以我已经确认我的脚本没有错误。
不幸的是,我的老板仍然希望我弄清楚这个问题,并找出为什么它在Linux上不起作用。我完全不知道为什么,也不知道去哪里找。如有任何提示,我们将不胜感激!
我刚刚在尝试从scounix服务器获取文件时遇到了这个问题。
服务器文件位置:/home/user/data/myfile.csv
我可以将以下内容放入任何浏览器,它就会获得文件。
ftp://user:password@host/data/myfile.csv
然而,如果我运行以下程序,我会得到与相同的错误
$f = fopen("ftp://user:password@host/data/myfile.csv", "r");
然而,如果我把完整的路径放进fopen,它会很好地工作。
$f = fopen("ftp://user:password@host/home/user/data/myfile.csv", "r");
我不确定这是否会为您解决问题,但对我有效。