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

6
我认为我已经找到了一个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);

?>

我没有使用过这个API,但我猜想你需要递归地列出目录的内容,然后将它们一个一个地发送到“upload”方法。这里有一些简单的示例说明:http://php.net/manual/en/class.recursivedirectoryiterator.php - halfer
我曾经有人帮我处理这个问题,但对于我所想的来说有点太复杂了。我更倾向于使用类似我上面提到的 PHP 解决方案。 - maltadolls
1
错误,我建议的是一些简单的东西(4或5行代码),而且还是用PHP编写的!您可以将这些代码集成到您的解决方案中,而不是孤立地使用它们(它们只是列出目录中的文件)。 - halfer
我正在学习PHP的第三周,所以对我来说一切都是崭新和陌生的。你能给我提供一个代码示例吗? - maltadolls
该主题的四个问题: - halfer
3个回答

3
我建议的是这样做(根据他的想法,我修改了你的潜在解决方案),所以应该归功于@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);

?>

顺便提一下,上面的函数来源于这里:如何使用 PHP 将特定目录中的文件备份到 Dropbox?


2
如果你想重新创建文件和文件夹,你需要自己处理递归。如果到明天还没有其他人发布代码,我会在明天发布。现在是凌晨5点,我好困啊 ;) 好吗? - Alireza Noori
1
@maltadolls 我写这个之前一直睡不着。试试这个,看看它是否有效。 - Alireza Noori
1
@Alireza,我认为有一个函数不一致 - uploaddirtodropboxuploadx。不过工作做得很好! - halfer
1
啊,谢谢链接 @Alireza - 这显示原帖已经以不同的方式提问了四次。我会尝试关闭其中一些 - 真是浪费时间! - halfer
1
@maltadolls - 不用担心,很高兴我们能帮到你 - 很高兴你已经解决了问题。在另一个问题中,我链接了一篇关于如何使用StackOverflow的文章(http://blog.jondh.me.uk/2012/09/how-to-use-stack-overflow/) - 该页面被管理员删除了,所以我再次提供它。希望对你有所帮助! - halfer
显示剩余24条评论

2
这里是从我在评论中向你指出的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. 将你代码中的$uploader->upload()行用我提供的for循环包装起来,删除我的代码中的echo语句
  8. 在你的代码中将$name更改为$backup_files

稍微尝试一下,它应该能够正常工作。祝你好运,并随时提问!


我按照您的指示更新了我的问题,作为_Potential Solution_。不幸的是,错误日志告诉我_[19-Mar-2013 17:43:47] PHP警告:DropboxUploader :: upload()的第1个参数丢失,调用位于/home5/../upload_dropbox.php的第30行并在/home5/../DropboxUploader.php的第66行定义。请问我在按照您的说明时做错了什么吗? - maltadolls
@maltadolls,我已经发布了一个答案,如果它有效,请选择这个作为答案。 - Alireza Noori
@maltadolls:是的,Alireza 的想法是正确的。在第7步中,我希望您将 $uploader->upload() 包装foreach 循环中,即在此行之前放置 foreach,并在其后放置闭合大括号。 - halfer
@halfer 谢谢。你的解决方案有效,我在Alireza的建议下修改了我的代码。但它没有复制文件夹和文件夹中的文件。 - maltadolls
1
它应该确保将文件夹中的所有文件复制到一个目标文件夹中。尝试完全删除第二个参数,或者将“/Backup/Files/”替换为您知道在Dropbox中存在的远程路径。如果需要,请使用Dropbox的Web界面在Dropbox上创建新路径。 - halfer

0

请问我该如何处理呢?我更喜欢一个简单的PHP解决方案。 - maltadolls
@maltadolls “简单”的解决方案是使用CLI版本。 - Alireza Noori
我该如何实现它? - maltadolls

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接