从FTP流式传输文件并让用户同时下载它

时间:2012-04-22 22:17:51

标签: php ftp

我正在创建一个备份系统,其中备份将自动生成,因此我将备份存储在不同的服务器上,但是当我想下载它们时,我希望链接是一次性链接,这不是很难做到,但为了使这个安全,我正在考虑存储文件,以便它们无法通过其他服务器上的http访问。

所以我要做的是通过ftp进行connet,将文件下载到主服务器,然后将其呈现给下载和删除,但是如果备份很大,是否有一种方法可以从FTP没有显示下载实际位置的人而不将其存储在服务器上?

1 个答案:

答案 0 :(得分:0)

以下是使用cURL的一个非常基本的示例。它指定一个读回调函数,当数据可以从FTP读取时将调​​用该回调函数,并将数据输出到浏览器,以便在与备份服务器进行FTP事务时同时下载到客户端。

这是一个非常基本的例子,你可以扩展。

<?php

// ftp URL to file
$url = 'ftp://ftp.mozilla.org/pub/firefox/nightly/latest-firefox-3.6.x/firefox-3.6.29pre.en-US.linux-i686.tar.bz2';

// init curl session with FTP address
$ch = curl_init($url);

// specify a callback function for reading data
curl_setopt($ch, CURLOPT_READFUNCTION, 'readCallback');

// send download headers for client
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="backup.tar.bz2"');

// execute request, our read callback will be called when data is available
curl_exec($ch);


// read callback function, takes 3 params, the curl handle, the stream to read from and the maximum number of bytes to read    
function readCallback($curl, $stream, $maxRead)
{
    // read the data from the ftp stream
    $read = fgets($stream, $maxRead);

    // echo the contents just read to the client which contributes to their total download
    echo $read;

    // return the read data so the function continues to operate
    return $read;
}

有关CURLOPT_READFUNCTION选项的详情,请参阅curl_setopt()