Передача файла с помощью Dropbox API напрямую на удаленный FTP-сервер без загрузки промежуточного файла

0

У меня большие файлы дизайна (до 500 МБ) на Dropbox, и я создаю инструмент для передачи одного файла программно на FTP-сервер поставщика в нашей онлайн-программе управления проектами на базе PHP. Из-за размера файла я не хочу загружать файл на сервер, а затем загружать этот файл на FTP-сервер из-за проблем с производительностью и объемом памяти.

Я могу использовать следующий вызов API Dropbox:

getFile( string $path, resource $outStream, string|null $rev = null )
Downloads a file from Dropbox. The file contents are written to the given $outStream and the file 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.

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

Как подключить ресурс getFile $ outstream с ресурсом ftp_fput $ ftp_stream?

  • 1
    Я не пробовал это, но, возможно, stream_copy_to_stream сделает эту работу? php.net/manual/en/function.stream-copy-to-stream.php
  • 0
    @ Грег, отличная идея, но это не сработало. Тем не менее, вы указали мне в правильном направлении. Я ценю это.
Теги:
ftp
dropbox
data-stream

1 ответ

0

Провел половину дня, экспериментируя с этим, и, наконец, получил его на работу. Решение включает использование PHP-данных://схема создания потока в памяти, а затем перемотка этого потока для отправки на 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);
  • 0
    Это не сработало для меня. Я получил сообщение об ошибке: Неустранимая ошибка PHP: необработанное исключение «InvalidArgumentException» с сообщением «outStream» имеет неверный тип; ожидающий ресурс, получил логическое значение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню