В Dropbox у меня есть большие файлы дизайна (до 500 МБ), и я создаю инструмент для программной передачи одного файла на FTP-сервер поставщика в нашей онлайн-программе управления проектами на основе PHP. Из-за размера файла я не хочу загружать файл на сервер, а затем загружать этот файл на FTP-сервер из-за проблем, связанных как со скоростью, так и с объемом памяти.
Я могу использовать следующий вызов Dropbox API:
getFile( string $path, resource $outStream, string|null $rev = null )
Downloads a file from Dropbox. The file's contents are written to the given $outStream and the file's metadata is returned.
И я предполагаю, что могу использовать следующую команду PHP:
ftp_fput ( resource $ftp_stream , string $remote_file , resource $handle , int $mode [, int $startpos = 0 ] )
Uploads the data from a file pointer to a remote file on the FTP server.
У меня нет опыта работы с потоками файловых данных, поэтому я понятия не имею, как их соединить. После нескольких часов онлайн-поиска, я решил попробовать спросить здесь.
Как мне связать ресурс $ outstream getFile с ресурсом $ ftp_stream ftp_fput?
Потратил половину дня, экспериментируя с этим, и наконец заставил это работать. Решение заключается в использовании схемы PHP data: // для создания потока в памяти, а затем перемотки этого потока для отправки его на FTP-сервер. Вот суть этого:
// open an FTP connection
$ftp_connection = ftp_connect('ftp.example.com');
ftp_login($ftp_connection,'username','password');
// get the file mime type from Dropbox, to create the correct data stream type
$metadata = $dopbox->getMetadata($file) // $dropbox is authenticated connection to Dropbox Core API; $file is a complete file path in Dropbox
$mime_type = $metadata['mime_type'];
// now open a data stream of that mime type
// for example, for a jpeg file this would be "data://image/jpeg"$stream = fopen('data://' .mime_type . ',','w+'); // w+ allows both writing and reading
$dropbox->getFile($file,$stream); // loads the file into the data stream
rewind($stream)
ftp_fput($ftp_connection,$remote_filename,$stream,FTP_BINARY); // send the stream to the ftp server
// now close everything
fclose($stream);
ftp_close($ftp_connection);
Других решений пока нет …