2012-06-29 2 views
1

Итак, я пытаюсь скопировать файл с моего локального сервера на удаленный сервер с FTP. Проблема в том, что мне нужно сделать это в кусках.PHP - Объединение файлов с FTP

До сих пор, основываясь на моих исследованиях, похоже, что это будет проще всего сделать, создав два файла на моем локальном сервере: скопированный файл и небольшой временный файл, содержащий текущий фрагмент. Тогда я должен просто объединить этот фрагмент с удаленным файлом.

Проблема в том, что у меня возникли проблемы с добавлением файлов. Я не могу понять, как работает протокол ftp://, и я не могу найти исчерпывающее объяснение того, как это сделать с помощью cURL. Самое близкое, что я нашел, это this, но я не мог заставить его работать.

Ниже приведено то, что я написал до сих пор. Я прокомментировал это, чтобы вы могли просто пропустить его, чтобы получить эту идею, и посмотреть, где я застрял - код не сложный. Что вы рекомендуете мне делать? Как добавить файл на моем локальном сервере файл на удаленном сервере с FTP?

<?php 

// FTP credentials 
$server = HIDDEN; 
$username = HIDDEN; 
$password = HIDDEN; 

// Connect to FTP 
$connection = ftp_connect($server) or die("Failed to connect to <b>$server</b>."); 

// Login to FTP 
if ([email protected]_login($connection, $username, $password)) 
{ 
    echo "Failed to login to <b>$server</b> as <b>$username</b>."; 
} 

// Destination file (where the copied file should go) 
$destination = 'final.txt'; 

// The file on my server that we're copying (in chunks) to $destination. 
$read = 'readme.txt'; 

// Current chunk of $read. 
$temp = 'temp.tmp'; 

// If the file we're trying to copy exists... 
if (file_exists($read)) 
{ 
    // Set a chunk size (this is tiny, but I'm testing 
    // with tiny files just to make sure it works) 
    $chunk_size = 4; 

    // For reading through the file we want to copy to the FTP server. 
    $read_handle = fopen($read, 'r'); 

    // For writing the chunk to its own file. 
    $temp_handle = fopen($temp, 'w+'); 

    // Loop through $read until we reach the end of the file. 
    while (!feof($read_handle)) 
    { 
     // Read a chunk of the file we're copying. 
     $chunk = fread($read_handle, $chunk_size); 

     // Write that chunk to its own file. 
     fwrite($temp_handle, $chunk); 

     //////////////////////////////////////////// 
     ////         //// 
     ////  NOW WHAT?? HOW DO I   //// 
     ////  WRITE/APPEND THAT   //// 
     ////  CHUNK TO $destination?  //// 
     ////         //// 
     //////////////////////////////////////////// 
    } 
} 

fclose($read_handle); 
fclose($temp_handle); 
ftp_close($ftp_connect); 
?> 

ответ

0

Во-первых, я не думаю, что вам нужно создать файл tmp. Вы можете добавить к целевому файлу либо «append mode» (a), как определено в the manual, либо использовать file_put_contents с флагом FILE_APPEND.

file_put_contents делает принимает имя файла в качестве параметра не описатель файла, так что в основном делает fopen для вас это означает, что если вы часто писать это будет fopen часто который является менее оптимальным по сравнению с использованием ручкой объявления файла fwrite.

<?php 
// The URI of the remote file to be written to 
$write = 'ftp://username1:[email protected]/path/to/writeme.txt'; 

// The URI of the remote file to be read 
$read = 'ftp://username2:[email protected]/path/to/readme.txt'; 

if (file_exists($read)) // this will work over ftp too 
{ 
    $chunk_size = 4; 
    $read_handle = fopen($read, 'r'); 
    $write_handle = fopen($write, 'a'); 

    while (!feof($read_handle)) 
    { 
     $chunk = fread($read_handle, $chunk_size); 
     fwrite($write_handle, $chunk); 
    } 
} 

fclose($read_handle); 
fclose($write_handle); 
?> 

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

+0

К сожалению, это не сработает. Он предполагает, что пункт назначения находится на локальном сервере, тогда как мне нужен целевой файл '$ destination' для сохранения на сервере REMOTE. – Nathanael

+0

На самом деле, как 'fopen', так и' fwrite' являются обертками протоколов, и они позволяют вам читать/записывать эти протоколы. –

+0

Как вы проводите различие между местоположениями '$ destination' и' $ read'? Вы справляетесь с ними одинаково. – Nathanael