我真的需要你的帮助。我成功建立了与我的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);
1。)我无法弄清楚为什么ftp_get返回false。建立连接,文件存在于正确的目录中。 2.)我不知道如何找到服务器上文件的mimetype并给它下载的文件,所以它没有损坏。
请帮帮我,我真的被卡住了。提前谢谢你
答案 0 :(得分:4)
首先尝试在本地保存,然后将其推回浏览器。
使用该代码在本地保存文件。
<?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(...); 线。之后,它运作良好。
答案 1 :(得分:0)
当我使用tempnam()
时,它将文件扩展名更改为.tmp
。这可能会导致问题,因此我不建议这样做。至少,您应该将扩展名更改回原始文件名中的内容。
您可以使用pathinfo()
与regexp和rename()
, 结合使用文件来实现此目的。
关于mimetype:如果您希望浏览器显示您发送给用户的文件,则只需要此信息。对于下载,浏览器只需要知道它是二进制文件,浏览器或用户可以从扩展名猜测。
如果您仍想检查mimetype,则必须等到文件在服务器上,因此mime检查代码将进入if(ftp_get())
块。
你没有显示你的连接代码(所以我假设),但你需要完整路径来处理你从FTP中提取的文件。如果ftp_get()
步骤失败,您可能正在请求无效文件。
否则,在连接并登录后,您必须ftp_chdir()
,这样您才能进入正确的远程文件夹。
此代码对我有用:
<?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'; } ?>
如果该代码不适合您,则可能会遇到权限,配置或其他一些特定于环境的问题。
答案 2 :(得分:0)
这对我有用:
$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;
这样您就不必先在本地保存文件