Мне нужно предоставить конечному пользователю моего веб-портала файл, хранящийся на FTP-сервере.
Я создаю локальный временный файл, я загружаю файл FTP во временный файл, и когда он заканчивается, я отправляю его с ответом файла Symfony HTTP:
$tempPath = tempnam(sys_get_temp_dir(), 'ftp');
$tempFile = fopen($tempPath, 'a+');
$log = "myLog";
$pass = "myPwd";
$conn_id = ftp_connect('my.ftp.server');
$ftp_login = ftp_login($conn_id, $log, $pass);
ftp_fget($conn_id, $tempFile, $path, FTP_ASCII, 0);
ftp_close($conn_id);
fclose($tempFile);
return $app->sendFile($tempPath, 200, array('Content-Type' => 'application/force-download', 'Content-disposition' => "attachment; filename=myFile.zip"));
Это работает, но я бы сделал лучше (обеспечить удаление временных файлов, повысить производительность, …)
Я вижу, что Symfony предоставляет HTTP-ответчик в виде потокового ответа, поэтому я представляю, что нужно отправить файл FTP без сохранения его на жестком диске веб-сервера.
Чтобы получить его, я думаю, что мне нужно подключиться ftp_fget()
функция (или другая функция FTP) для функции PHP, которая может выводить ее в php://output
или стандартный вывод (я действительно не знаю эту область PHP).
Я нахожу readfile()
функция, но она принимает имя файла в качестве аргумента, а не как ресурс ftp_fget()
необходимость… Есть ли другая функция, совместимая с fget_fget или другим способом сделать это?
Ваша проблема состоит из двух частей:
Чтение файла FTP в виде потока (см. Пример с fread()
: «PHP: Как мне прочитать файл .txt с FTP-сервера в переменную?«)
Других решений пока нет …