如何使用PHP从服务器复制文件到Dropbox


How to copy files from server to Dropbox using PHP?

我想我可能找到了一个PHP程序,可以从特定文件夹上传文件到我的Dropbox帐户。完整的解决方案可以在这里找到。

代码似乎可以工作,因为文件和文件夹正在上传。但是,我不希望服务器上的文件事先被压缩:我想复制所有文件以及其中的文件和文件夹。

请问如何修改代码?我想要的就是从我的服务器上复制一个名为uploads的特定目录到dropbox。修改代码后,我设法得到了这个代码:

    <?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");
    ?>

实际解决方案特别感谢Alireza Noori, halfer和其他所有人。

<?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);
?>

@halfer的建议是这样的(我只是根据他的想法修改了你的潜在解决方案),所以他应该得到表扬:

<?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,上面的功能是从这里:如何备份文件从一个特定的目录到Dropbox仅使用PHP ?

这是我在评论中指出的PHP站点的代码片段。它所做的只是接受一个目录路径(作为一个字符串),并输出其中所有文件的完整路径名(作为一些字符串)。这是非常有用的,因为我们可以使用这个功能对单个文件做一些事情(比如上传到Dropbox)。

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

所以,既然你想学习PHP,而且如果我给你一个现成的解决方案:-),你什么也学不到,试试下面的方法:

  1. 从代码中删除system调用,因为您不想做任何压缩
  2. 获取我提供的在您的机器上工作的代码片段(它将自己工作),将'/etc'更改为您想要的任何路径
  3. 将我的代码中的$path更改为您在您的代码中使用的$siteroot
  4. 在我的代码中删除$path = ...行(因为你自己定义了$siteroot)
  5. 再次测试代码片段
  6. 在你定义$siteroot之后,从我的代码中添加$objects行,到你的代码
  7. 用我提供的for循环包装代码中的$uploader->upload()行,从我的代码中删除echo语句
  8. $name更改为$backup_files

稍微动一下,它应该可以工作。祝你好运,请随时提问!

如何使用命令行版本的dropbox?http://www.dropboxwiki.com/Using_Dropbox_CLI

将文件复制到dropbox文件夹中,让守护进程做它需要做的事情。