PHP:从ftp服务器下载任何文件到硬盘?

PHP:从ftp服务器下载任何文件到硬盘?,php,ftp,download,Php,Ftp,Download,我真的需要你的帮助。我正在成功设置与ftp服务器的连接。但是,我不知道如何从服务器下载动态文件。我想这也会帮助很多其他人,因为我在网上找不到任何教程或解释 我只是在ftp上列出我的所有文件。如果我点击其中一个,我会调用download.php,它会再次连接到服务器,并将文件下载到我的硬盘上。我能够自动提示一个下载窗口,一个文件被下载到我的硬盘上。但是,只有未设置头的损坏文件 /* path to files on ftp server … e.g. /folder/folder/name_of_

我真的需要你的帮助。我正在成功设置与ftp服务器的连接。但是,我不知道如何从服务器下载动态文件。我想这也会帮助很多其他人,因为我在网上找不到任何教程或解释

我只是在ftp上列出我的所有文件。如果我点击其中一个,我会调用download.php,它会再次连接到服务器,并将文件下载到我的硬盘上。我能够自动提示一个下载窗口,一个文件被下载到我的硬盘上。但是,只有未设置头的损坏文件

/* path to files on ftp server … e.g. /folder/folder/name_of_file.jpg */
$p_arr = explode("/", $path);
/* the file name … e.g name_of_file.jpg */
$file = end($p_arr);

//$finfo = finfo_open(FILEINFO_MIME_TYPE); //returns a fatal error - function not found 
//$mimetype = finfo_file($finfo, $file);
//finfo_close($finfo);

//filetype($file)

/* creating a temporyry file to save to */
$tempFile = tempnam("/tmp", "FOO");

if(ftp_get($conn_id, $tempFile, $file, FTP_BINARY)){ 
    /*header Content-type: must be dynamic*/
    //header('Content-type:' . $mimetype);

    /*header to auto_prompt download window*/
    header('Content-Disposition: attachment; filename="'. $file .'"');
    readfile($tempFile);
} else { 
    echo "There was a problem <br>";
    echo $file . "<br>"; //e.g. image.jpg
}

/* deleting the file after the process */
//unlink($tempFile);
/*ftp服务器上文件的路径…例如/folder/folder/name\u of_file.jpg*/
$p_arr=分解(“/”,$path);
/*文件名…例如_file.jpg的名称*/
$file=end($p_arr);
//$finfo=finfo\u open(FILEINFO\u MIME\u类型)//返回致命错误-未找到函数
//$mimetype=finfo_文件($finfo,$file);
//finfo_close($finfo);
//文件类型($file)
/*创建要保存到的临时文件*/
$tempFile=tempnam(“/tmp”,“FOO”);
如果(ftp_-get($conn_-id,$tempFile,$file,ftp_-BINARY)){
/*标题内容类型:必须是动态的*/
//标题('Content-type:'。$mimetype);
/*自动提示下载窗口的标题*/
标题('Content-Disposition:attachment;filename=“.”.$file.'”);
readfile($tempFile);
}否则{
echo“出现了一个问题
”; echo$file.“
”;//例如image.jpg } /*在进程结束后删除文件*/ //取消链接($tempFile);
1.)我不明白为什么ftp_get返回值为false。连接已建立,并且文件存在于正确的目录中。 2.)我不知道如何在服务器上找到文件的mimetype并将下载的文件提供给它,这样它就不会损坏


请帮帮我,我真的卡住了。提前感谢

请先在本地保存,然后将其推回到浏览器

使用该代码在本地保存文件

<?php
                // define some variables
        $folder_path = "YOUR FOLDER PATH";
        $local_file = "LOCAL FILE PATH";
        $server_file = "SERVER FILE PATH";

        //-- Connection Settings
        $ftp_server = "IP ADDRESS"; // Address of FTP server.
        $ftp_user_name = "USERNAME"; // Username
        $ftp_user_pass = "PASSWORD"; // Password
        #$destination_file = "FILEPATH";

        // set up basic connection
        $conn_id = ftp_connect($ftp_server);

        // login with username and password
        $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

        // try to download $server_file and save to $local_file
        if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
            echo "Successfully written to $local_file\n";
        } else {
            echo "There was a problem\n";
        }

        // close the connection
        ftp_close($conn_id);
?>

我也发现了这个,也许它能帮到你

我的FTP服务器总是有响应 “bool(false)”而不是介绍我 目录列表。我必须补充一点 ftp_pasv($conn_id,true);刚好在…之后 $login_result=ftp_login(…); 线路。在那之后,一切都很好


尝试先将其保存在本地,然后将其推回浏览器

使用该代码在本地保存文件

<?php
                // define some variables
        $folder_path = "YOUR FOLDER PATH";
        $local_file = "LOCAL FILE PATH";
        $server_file = "SERVER FILE PATH";

        //-- Connection Settings
        $ftp_server = "IP ADDRESS"; // Address of FTP server.
        $ftp_user_name = "USERNAME"; // Username
        $ftp_user_pass = "PASSWORD"; // Password
        #$destination_file = "FILEPATH";

        // set up basic connection
        $conn_id = ftp_connect($ftp_server);

        // login with username and password
        $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

        // try to download $server_file and save to $local_file
        if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
            echo "Successfully written to $local_file\n";
        } else {
            echo "There was a problem\n";
        }

        // close the connection
        ftp_close($conn_id);
?>

我也发现了这个,也许它能帮到你

我的FTP服务器总是有响应 “bool(false)”而不是介绍我 目录列表。我必须补充一点 ftp_pasv($conn_id,true);刚好在…之后 $login_result=ftp_login(…); 线路。在那之后,一切都很好

坦普南() 当我使用
tempnam()
时,它将文件扩展名更改为
.tmp
。这可能会导致问题,所以我不建议这样做。至少,您应该将扩展名更改回原始文件名中的扩展名

您可以在ftp文件后,与和一起使用来实现此目的

模版 关于mimetype:如果希望浏览器显示发送给用户的文件,则只需要此信息。对于下载,浏览器只需要知道它是一个二进制文件,浏览器或用户就可以从扩展名中猜出

如果仍要检查mimetype,则必须等到文件位于服务器上,这样mime检查代码将进入
If(ftp_get())

ftp 您还没有显示连接代码(我假设是这样),但是您需要从FTP提取文件的完整路径。如果
ftp\u get()
步骤失败,则可能是请求了无效文件

否则,您必须在连接并登录后才能进入正确的远程文件夹

代码 这个代码对我有用:

<?php $ftp = ftp_connect('server'); ftp_login($ftp, 'username', 'password'); $file = '/media.banzaimonkey.net/images/forums/boasas_banner_07.gif'; $tempFile = tempnam("/tmp", "FOO"); if(ftp_get($ftp, $tempFile, $file, FTP_BINARY)){ echo 'success!'; } else { echo 'ffffail'; } ?> 如果该代码不适用于您,您可能会遇到权限、配置或其他特定于环境的问题。

tempnam() 当我使用
tempnam()
时,它将文件扩展名更改为
.tmp
。这可能会导致问题,所以我不建议这样做。至少,您应该将扩展名更改回原始文件名中的扩展名

您可以在ftp文件后,与和一起使用来实现此目的

模版 关于mimetype:如果希望浏览器显示发送给用户的文件,则只需要此信息。对于下载,浏览器只需要知道它是一个二进制文件,浏览器或用户就可以从扩展名中猜出

如果仍要检查mimetype,则必须等到文件位于服务器上,这样mime检查代码将进入
If(ftp_get())

ftp 您还没有显示连接代码(我假设是这样),但是您需要从FTP提取文件的完整路径。如果
ftp\u get()
步骤失败,则可能是请求了无效文件

否则,您必须在连接并登录后才能进入正确的远程文件夹

代码 这个代码对我有用:

<?php $ftp = ftp_connect('server'); ftp_login($ftp, 'username', 'password'); $file = '/media.banzaimonkey.net/images/forums/boasas_banner_07.gif'; $tempFile = tempnam("/tmp", "FOO"); if(ftp_get($ftp, $tempFile, $file, FTP_BINARY)){ echo 'success!'; } else { echo 'ffffail'; } ?> 如果该代码不适用于您,则您可能在权限、配置或其他特定于环境的问题上有问题。

这对我适用:

$fname = "file.xxx";

$conn = ftp_connect(FTP_URL);
if(ftp_login($conn, FTP_USER, FTP_PWD))
{
    if(ftp_chdir($conn, FTP_DIR))
    {
        $th = fopen('php://temp', 'r+');
        if(ftp_fget($conn, $th, $fname, FTP_ASCII, 0))
        {
            rewind($th);
            $data = stream_get_contents($th);
        }
    }
}

header("Content-Disposition: attachment; filename=$fname");
echo $data;
这样,您就不必先在本地保存文件了

这对我很有用:

$fname = "file.xxx";

$conn = ftp_connect(FTP_URL);
if(ftp_login($conn, FTP_USER, FTP_PWD))
{
    if(ftp_chdir($conn, FTP_DIR))
    {
        $th = fopen('php://temp', 'r+');
        if(ftp_fget($conn, $th, $fname, FTP_ASCII, 0))
        {
            rewind($th);
            $data = stream_get_contents($th);
        }
    }
}

header("Content-Disposition: attachment; filename=$fname");
echo $data;

这样,您就不必先在本地保存文件了

这是什么意思?如何在本地保存?看起来原始代码已经在本地保存(或尝试保存),保存在tmp文件夹中。是的,没错!这就是为什么我没有得到它!不要在本地保存它。如果我现在不知道用户的本地路径,我应该在哪里本地保存文件。我只想从我的服务器上列出我的文件,点击下载到他们的硬盘。没有别的了。我想从服务器上的文件中获取正确的头并将其传递给