Хобрук: Ваш путь к мастерству в программировании

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

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

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

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?

06.03.2015

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

Ответы:


1

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

    Понимание структуры каталогов Linux
    Структура каталогов Linux — это иерархическая организация файлов и каталогов в системе Linux. Понимание этой структуры важно для всех, кто хочет использовать Linux в качестве основной..

    Введение в SQLite3 в Python
    SQLite3 — это популярная и часто используемая программная библиотека для управления реляционными базами данных. Она портативна, быстра и проста в использовании, что делает ее отличным выбором..

    Как создать ORM в Node.js
    Что такое ОРМ? Проще говоря, система ORM — это метод, в котором вы используете объектно-ориентированную парадигму для создания сопоставления между приложением и базой данных для выполнения..

    Руководство для начинающих по обработке естественного языка .
    Обработка естественного языка — захватывающая и быстро развивающаяся область, которую можно охарактеризовать как сочетание лингвистики, информатики и искусственного интеллекта. Это помогает..

    Защитите свое приложение NodeJS с помощью веб-токенов JSON (JWT): руководство по аутентификации на основе токенов
    В современном мире веб-приложений безопасность важнее, чем когда-либо. Одним из наиболее важных аспектов защиты веб-приложений является аутентификация пользователей. Аутентификация на основе..

    Вводное руководство по аннотациям @PreAuthorize и @PostAuthorize в Spring Security
    Введение Spring Security — это мощная и настраиваемая среда аутентификации и контроля доступа для приложений Java, особенно тех, которые созданы с использованием среды Spring. Этот пост..

    От стартапов к успеху в индустрии наук о данных: 5 важных инструментов
    Постоянно растущие объемы данных сегодня играют решающую роль для каждой компании, которая хочет оставаться на вершине. Это означает использование технологий искусственного интеллекта ,..