How to copy files from server to Dropbox using PHP

2019-02-02 01:15发布

This question already has an answer here:

I think I may have found a PHP program to upload files from a specific folder onto my Dropbox account. The full solution can be found here.

The code seems to work because files and folders a like are being uploaded. However, I don't want the files on my server to be compressed beforehand: I want to copy all files with the files and folders within.

How can the code be modified please? All I want is to copy a specific directory called uploads from my server to dropbox. After modifying the code I managed to arrive at this code:

    <?php

    // Set the timezone so filenames are correct
    date_default_timezone_set('Europe/London');

    // Dropbox username/password
    $dropbox_email='dropbox@dropbox.com';
    $dropbox_pass='password';


    // Filenames for backup files
    $backup_files = "files_" . date("Y.m.d-h.i.s_l") . '.zip';


    // File to backup
    $siteroot = "/site/home/public_html/website/parent/child/uploads/";


    // Backup all files in public_html apart from the gz
    system("zip -r $backup_files $siteroot");


    include("DropboxUploader.php");

    $uploader = new DropboxUploader($dropbox_email, $dropbox_pass);
    $uploader->upload($backup_files,'Backup/Files/');

    system("rm $backup_files");

    ?>

Actual Solution Special thanks to Alireza Noori, halfer and everyone else.

<?php

// Set the timezone so filenames are correct
date_default_timezone_set('Europe/London');

// Backup all files in public_html apart from the gz
$siteroot = "/path/to/backup";

$dropbox_email='dropbox@email';  //Dropbox username
$dropbox_pass='pass';   // Dropbox password

include("DropboxUploader.php");

$uploader = new DropboxUploader($dropbox_email, $dropbox_pass);

function FolderToDropbox($dir, $dropbox_link){    
    $dropbox_folder = 'FolderInDropboxRoot/';
    $files = scandir($dir);
    foreach($files as $item){
        if($item != '.' && $item != '..'){
            if(is_dir($dir.'/'.$item)) FolderToDropbox($dir.'/'.$item,$dropbox_link);
            else if(is_file($dir.'/'.$item)) {
                $clean_dir = str_replace("/path/to/backup", "", $dir);
                $dropbox_link->upload($dir.'/'.$item,$dropbox_folder.$clean_dir.'/');  
            } 
        }
    }
}

FolderToDropbox($siteroot,$uploader);

?>

3条回答
做个烂人
2楼-- · 2019-02-02 01:47

What about using the command line version of dropbox? http://www.dropboxwiki.com/Using_Dropbox_CLI

Copy the files to the dropbox folder and let the deamon do what it needs to do.

查看更多
放荡不羁爱自由
3楼-- · 2019-02-02 01:48

Here's a snippet of code from the PHP site that I pointed you to in the comments. All it does is take a directory path (as a string) and output the full pathname of all files inside it (as a number of strings). This is very useful, as we can use this ability to do something to files on an individual basis (like upload them to Dropbox).

<?php

$path = realpath('/etc');
$objects = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($path),
    RecursiveIteratorIterator::SELF_FIRST
);
foreach($objects as $name => $object) {
    echo "$name\n";
}

So, since you're wanting to learn PHP, and since you'll not learn anything if I give you a ready-made solution :-), try the following:

  1. Remove the system call from your code, since you don't want to do any compression
  2. Get the snippet I've provided working on your machine (it will work on its own), changing '/etc' to whatever path you want
  3. Change $path in my code to $siteroot which you use in yours
  4. Remove the $path = ... line in my code (since you define $siteroot yourself)
  5. Test the snippet again
  6. Add in the $objects line from my code after you define $siteroot, into your code
  7. Wrap the $uploader->upload() line in your code with the for loop I provide, removing the echo statement from my code
  8. Change $name to $backup_files in your code

Jiggle it all about a bit, and it should work. Good luck, and feel free to ask questions!

查看更多
看我几分像从前
4楼-- · 2019-02-02 02:06

What @halfer is suggesting is this (I just modified your potential solution based on his idea) so he should take credit:

<?php

function uploadx($dirtocopy, $dropboxdir, $uploader){
    if ($handle = opendir($dirtocopy)) {
        while (false !== ($entry = readdir($handle))) {
            if ($entry != "." && $entry != "..") {

                if(is_dir($entry)){
                    uploadx($dirtocopy.$entry.'/', $dropboxdir.$entry.'/', $uploader);
                } else {
                    $uploader->upload($dirtocopy.$entry, $dropboxdir.$entry);
                }

            }
        }
        closedir($handle);
    }
}

// Dropbox username/password
$dropbox_email='dropbox@dropbox.com';
$dropbox_pass='password';

// File to backup
$siteroot = "./";

include("DropboxUploader.php");

$uploader = new DropboxUploader($dropbox_email, $dropbox_pass);

uploadx($siteroot, 'Backup/Files/', $uploader);

?>

BTW, the function above is from here: How to backup files from a specific directory to Dropbox using PHP only?

查看更多
登录 后发表回答