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);
?>
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?
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:
- Remove the
system
call from your code, since you don't want to do any compression - Get the snippet I've provided working on your machine (it will work on its own), changing '/etc' to whatever path you want
- Change
$path
in my code to$siteroot
which you use in yours - Remove the
$path = ...
line in my code (since you define$siteroot
yourself) - Test the snippet again
- Add in the
$objects
line from my code after you define$siteroot
, into your code - Wrap the
$uploader->upload()
line in your code with thefor
loop I provide, removing the echo statement from my code - 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!
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.
来源:https://stackoverflow.com/questions/15506402/how-to-copy-files-from-server-to-dropbox-using-php