Мне действительно нужна ваша помощь. Я успешно настраиваю соединение с моим ftp-сервером. Однако я не могу понять, как загрузить динамический файл с моего сервера. Думаю, это помогло бы многим другим людям, так как я не мог найти учебник или объяснения в любом месте в Интернете.
Я просто перечисляю все свои файлы на своем ftp. Если я нажму на один, я вызову download.php, который снова подключится к серверу и должен загрузить файл на моем жестком диске. Я смог автоматически запросить окно загрузки, и файл загрузится на мой hdd. однако только поврежденный файл, в котором нет заголовков.
/* path to files on ftp server … eg /folder/folder/name_of_file.jpg */ $p_arr = explode("/", $path); /* the file name … eg 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>"; //eg image.jpg } /* deleting the file after the process */ //unlink($tempFile);
1.) Я не могу понять, почему ftp_get возвращает false. Соединение устанавливается и файл существует в правильном каталоге. 2.) Я не знаю, как я могу узнать тип файла на сервере и предоставить ему загруженный файл, чтобы он не был поврежден.
пожалуйста, помогите мне, я действительно застрял. заранее спасибо
Сначала попробуйте сохранить его локально, а затем верните его в браузер.
Используйте этот код, чтобы сохранить файл локально.
<?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
. Это может вызвать проблемы, поэтому я не рекомендую это делать так. По крайней мере, вы должны изменить расширение на то, что было в исходном имени файла.
Вы можете достичь этого с помощью pathinfo()
в сочетании с regexp и rename()
после того, как вы установили файл ftp'ed.
Что касается типа mimetype: вам нужна только эта информация, если вы хотите, чтобы браузер отображал файл, который вы отправляете пользователю. Для загрузки браузер должен знать только, что это двоичный файл, и браузер или пользователь могут догадаться о расширении.
Если вы все еще хотите проверить тип mimetype, вам придется подождать, пока файл не будет находиться на вашем сервере, поэтому код проверки mime будет if(ftp_get())
внутри блока if(ftp_get())
.
Вы не указали свой код подключения (так я и предполагаю), но вам понадобится полный путь для файла, который вы извлекаете из FTP. Если шаг ftp_get()
не работает, возможно, вы запрашиваете недопустимый файл.
В противном случае вам ftp_chdir()
после подключения и входа в систему, чтобы вы 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)) { эхо «успех!»; } 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;
Таким образом, вам не нужно сначала сохранять файл локально