Создание и загрузка файла в PHP на FTP-сервер без локального сохранения - PullRequest
8 голосов
/ 20 апреля 2010

У меня проблема с подключением двух разных процессов, которые у меня работают. Мне было поручено извлечь данные из базы данных, создать файл из данных, а затем загрузить его на FTP-сервер.

Пока у меня есть файл, который создается и загружается с использованием этого кода, $out - строка, содержащая полный текстовый файл:

if ($output == 'file')
{
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Content-Length: ".strlen($out));
    header("Content-type: application/txt");
    header("Content-Disposition: attachment; filename=".$file_name);
    echo($out);
}

Это работает, когда я хочу просто запустить скрипт в браузере и загрузить файл, но вместо этого я хочу отправить его на FTP-сервер.

Я знаю, что мое подключение к FTP-серверу работает нормально, и я правильно перемещаюсь в нужный каталог, и я взял файлы с диска и поместил их на FTP с помощью ftp_put(), но я намереваясь взять $out и записать его непосредственно в виде файла с $filename в качестве имени на FTP-сервере. Возможно, я что-то неправильно понимаю, но когда я попробовал ftp_put и ftp_fput, казалось, что они хотят, чтобы расположение файлов, а не файловые потоки. Есть ли другая функция, которую я мог бы рассмотреть?

Ответы [ 4 ]

17 голосов
/ 20 апреля 2010

Я ответил здесь вместо комментариев, так как комментарии игнорируют форматирование кода.

Вы можете попробовать:


$fp = fopen('php://temp', 'r+');
fwrite($fp, $out);
rewind($fp);       
ftp_fput($ftp_conn, $remote_file_name, $fp, FTP_ASCII);

это создаст временный поток без фактической записи его на диск. Я не знаю другого пути

6 голосов
/ 04 марта 2015

Вот решение matei сверху как завершенная функция ftp_file_put_contents ():

function ftp_file_put_contents($remote_file, $file_string) {

// FTP login details
$ftp_server='my-ftp-server.de'; 
$ftp_user_name='my-username'; 
$ftp_user_pass='my-password';

// Create temporary file
$local_file=fopen('php://temp', 'r+');
fwrite($local_file, $file_string);
rewind($local_file);       

// FTP connection
$ftp_conn=ftp_connect($ftp_server); 

// FTP login
@$login_result=ftp_login($ftp_conn, $ftp_user_name, $ftp_user_pass); 

// FTP upload
if($login_result) $upload_result=ftp_fput($ftp_conn, $remote_file, $local_file, FTP_ASCII);

// Error handling
if(!$login_result or !$upload_result)
{
    echo('<p>FTP error: The file could not be written to the FTP server.</p>');
}

// Close FTP connection
ftp_close($ftp_conn);

// Close file handle
fclose($local_file); }


// Function call
ftp_file_put_contents('my-file.txt', 'This text will be written to your text file via FTP.');
3 голосов
/ 20 апреля 2010

На самом деле ftp_put ожидает путь к локальному файлу (в виде строки), поэтому попробуйте записать данные во временный файл, а затем ftp_put их на сервер.


file_put_contents('/tmp/filecontent'.session_id(), $out);
ftp_put($ftp_conn, $remote_file_name, '/tmp/filecontent'.session_id());
unlink('/tmp/filecontent'.session_id()); 

В этом случае вам не нужно отправлять заголовки, которые вы отправляли в вашем примере.

1 голос
/ 28 апреля 2017

Самое простое решение - использовать file_put_contents с FTP-упаковщиком URL :

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

Если это не работает, возможно, это из-за того, что в PHP не включены обертки URL .


Если вам нужен больший контроль над записью (режим передачи, пассивный режим, смещение, предел чтения и т. Д.), Используйте ftp_fput с ручкой для php://temp (или php://memory) поток :

$conn_id = ftp_connect('hostname');

ftp_login($conn_id, 'username', 'password');
ftp_pasv($conn_id, true);

$h = fopen('php://temp', 'r+');
fwrite($h, $out);
rewind($h);

ftp_fput($conn_id, '/path/to/file', $h, FTP_BINARY, 0);

fclose($h);
ftp_close($conn_id);

(добавить обработку ошибок)


Или вы можете открыть / создать файл прямо на FTP-сервере. Это особенно полезно, если файл большой, так как вам не придется хранить все содержимое в памяти.

См. Создание файла CSV на внешнем FTP-сервере в PHP .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...