使用 PHP 以块形式流式传输 FTP 上传


Stream FTP upload in chunks with PHP?

是否可以使用 PHP 流式传输 FTP 上传?我有文件需要上传到另一台服务器,我只能通过 FTP 访问该服务器。不幸的是,我无法在此服务器上增加超时时间。有可能做到这一点吗?

基本上,如果有一种方法可以写入文件的一部分,然后附加下一部分(并重复)而不是一次上传整个文件,那将节省我。但是,我的谷歌搜索并没有为我提供答案。

这是可以实现的吗?

好吧...这可能就是您要查找的内容。你熟悉卷曲吗?

CURL 可以支持追加 FTP:

curl_setopt($ch, CURLOPT_FTPAPPEND, TRUE );//追加标志

另一种选择是使用 ftp:///ftps://流,因为 PHP 5 它们允许附加。见 ftp://;ftps://文档。可能更容易访问。

将块附加到远程文件末尾的最简单方法是将file_put_contentsFILE_APPEND标志一起使用:

file_put_contents('ftp://username:pa‌​ssword@hostname/path/to/file', $chunk, FILE_APPEND);

如果它不起作用,可能是因为您没有在 PHP 中启用 URL 包装器。


如果您需要更好地控制写入(传输模式、被动模式等),或者无法使用file_put_contents,请使用带有php://temp(或php://memory)流句柄的ftp_fput

$conn_id = ftp_connect('hostname');
ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);
$h = fopen('php://temp', 'r+');
fwrite($h, $chunk);
rewind($h);
// prevent ftp_fput from seeking local "file" ($h)
ftp_set_option($conn_id, FTP_AUTOSEEK, false);
$remote_path = '/path/to/file';
$size = ftp_size($conn_id, $remote_path);
$r = ftp_fput($conn_id, $remote_path, $h, FTP_BINARY, $size);
fclose($h);
ftp_close($conn_id);

(添加错误处理)