使用PHP或Python从FTP服务器读取或下载文件的5kb,而不是下载或读取整个文件

我想从FTP服务器下载读取文件的一部分,而不是下载整个文件,这只是为了查看FTP服务器中存在的数据是正确的。

我们有太多的客户端,FTP服务器中的每个文件都可能是任意大小,因此,我只想下载或读取文件的一部分,而不是下载 ,假设我只需要5kb的文件,或者如果要从文件的第100行开始。

我在PHP中有一个如下所示的函数,可以完成一半的工作,但是对于较大的文件,它会失败。

function readByBytes($path)
{
    try
    {
        $handle = fopen($path,"rb");
        if ($handle) 
        {
            while (($buffer = fgets($handle,4096)) !== false)
            {

            }
            if (!feof($handle))
            {
                echo "Error: unexpected fgets() fail\n";
            }
            fclose($handle);
        }
    }
    catch (Exception $e)
    {
        echo $e;
    }
}


$filename = "ftp://username:password@127.0.0.1/prod/clientfeed.csv";

$iterator = readByBytes($filename);

foreach ($iterator as $key => $iteration)
{
    /// if file read is 5kb or some 100 lines
    break;
}

有人可以用PHP或Python帮助我或指导我吗

在获得警告错误以下

PHP Warning:  fopen(ftp://...@127.0.0.1/prod/clientfeed.csv): failed 
to open stream: FTP server reports 550 Could not get file size.
 in /var/www/html/newLpplugins/ftp_read_line_line.php on line 80
PHP Warning:  filesize(): stat failed for 
ftp://...@127.0.0.1/prod/clientfeed.csv in 
/var/www/html/newLpplugins/ftp_read_line_line.php on line 81
PHP Warning:  fread() expects parameter 1 to be resource,bool given 
in /var/www/html/newLpplugins/ftp_read_line_line.php on line 81
PHP Warning:  fclose() expects parameter 1 to be resource,bool given 
in /var/www/html/newLpplugins/ftp_read_line_line.php on line 82
PHP Warning:  
file_get_contents(ftp://...@127.0.0.1/prod/clientfeed.csv): failed to 
open stream: FTP server reports 550 Could not get file size.
in /var/www/html/newLpplugins/ftp_read_line_line.php on line 84

谢谢。

gxwmwy 回答:使用PHP或Python从FTP服务器读取或下载文件的5kb,而不是下载或读取整个文件

如果您只想读取文件的一部分,则只需删除while循环并仅调用fgets一次即可。

$buffer = fgets($handle,4096);

尽管如果文件是二进制文件,或者您想读取固定字节数,则最好使用fread

$buffer = fread($handle,4096);

尽管您的服务器与PHP URL包装器不兼容,请参见:
Getting "FTP server reports 550 Could not get file size." when using FTP URL in fopen
而且PHP无法提供任何其他健壮的替代方案来满足您的需求。


尽管它可以在ftplib中用Python实现:

ftp = FTP()
ftp.connect(host,user,passwd)

size = 4096

ftp.voidcmd('TYPE I')
cmd = "RETR {}".format(filename)
conn = ftp.transfercmd(cmd)
data = b""
try:
    while len(data) < size:
        buf = conn.recv(min(size - len(data),8192))
        if not buf:
            break
        data += buf
finally:
    conn.close()
try:
    ftp.voidresp()
except:
    # As the connection is aborted,the server will report an error,ignore it
    pass

代码基于我对以下内容的回答:
Get files names inside a zip file on FTP server without downloading whole archive
(您甚至可以看到支持加密FTPS的版本)

,

有多种方法可以在python中实现。

解决方案1:

Paramkio-用python实现的SSH V2库  Paramiko可以选择从远程位置的文件中读取N个字节

sClient = ssh_client.open_sftp()
remoteFileLocation = sftp_client.open('<filepath>')
for line in remote_file:
    #dosomethinghere

选择2:

这是一个临时解决方案。在此之前,只需澄清一下是否只想知道文件中包含内容,就可以使用它。

使用Python子进程模块运行远程命令以获取文件大小。

        from subprocess import Popen,PIPE
        p = Popen(["du","-sh","filepath"],stdin=PIPE)
        output = p.communicate(msg.as_string())
本文链接:https://www.f2er.com/3117270.html

大家都在问