So, I'm trying to copy a file from my local server to a remote server with FTP. The problem is, I need to do this in chunks.

Thus far, based on my research, it looks like it will probably be easiest to do this by making two files on my local server: the file to be copied, and a small, temporary file that holds the current chunk. Then, I should simply merge that chunk with the remote file.

The problem is, I'm having trouble appending files. I can't figure out how the ftp:// protocol works, and I can't find a comprehensive explanation on how to do it with cURL. The closest I've found is this, but I couldn't get it working.

Below is what I've written up so far. I've commented it so you can just skim through it to get the idea, and see where I'm stuck--the code isn't complicated. What do you recommend I do? How do I append a file on my local server a file on a remote server with 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 (!@ftp_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);
?>
有帮助吗?

解决方案

First off i don't think you need to create the tmp file. You can append to the destination file either using "append mode" (a) as defined in the manual or use file_put_contents with the FILE_APPEND flag.

file_put_contents does takes a filename as parameter not a file handle so it basically does fopen for you which means that if you write frequently it will fopen frequently which is less optimal compared to using the file handle ad fwrite.

<?php
// The URI of the remote file to be written to
$write = 'ftp://username1:password1@domain1.com/path/to/writeme.txt';

// The URI of the remote file to be read
$read = 'ftp://username2:password2@domain2.com/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);
?>

As a side note: PHP has stream wrappers that make ftp access a breeze without using the ftp functions themselves.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top