I would like to create a PHP script to backup files from a particular directory on my website to my Dropbox account.
I tried to search for examples and how to work around it but I only found code to backup databases or to buy ready made solutions.
This is the code I tried
<?php
$passw = "jason"; //change this to a password of your choice.
if ($_POST) {
require 'DropboxUploader.php';
try {
// Rename uploaded file to reflect original name
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK)
throw new Exception('File was not successfully uploaded from your computer.');
$tmpDir = uniqid('/tmpCapes/');
if (!mkdir($tmpDir))
throw new Exception('Cannot create temporary directory!');
if ($_FILES['file']['name'] === "")
throw new Exception('File name not supplied by the browser.');
$tmpFile = $tmpDir.'/'.str_replace("/\0", '_', $_FILES['file']['name']);
if (!move_uploaded_file($_FILES['file']['tmp_name'], $tmpFile))
throw new Exception('Cannot rename uploaded file!');
if ($_POST['txtPassword'] != $passw)
throw new Exception('Wrong Password');
// Upload
$uploader = new DropboxUploader('user@example.com', 'password');// enter dropbox credentials
$uploader->upload($tmpFile, $_POST['dest']);
echo '<span style="color: green;font-weight:bold;margin-left:393px;">File successfully uploaded to my Dropbox!</span>';
} catch(Exception $e) {
echo '<span style="color: red;font-weight:bold;margin-left:393px;">Error: ' . htmlspecialchars($e->getMessage()) . '</span>';
}
// Clean up
if (isset($tmpFile) && file_exists($tmpFile))
unlink($tmpFile);
if (isset($tmpDir) && file_exists($tmpDir))
rmdir($tmpDir);
}
?>
But instead of uploading the image from my PC to Dropbox via my website. I want to modify the above code to copy files in a specific directory on my website to Dropbox.
You need recursive code.
Write a function that takes a dir as its argument.
Have it loop through the dir looking at each file. For each file, it checks if it's a dir, and if it's not, it copies it.
If it is a dir, the function calls itself.
e.g.
// your code
require 'DropboxUploader.php';
$dirtocopy = './example_directory/';
$dropboxdir = 'backupdir/';
$uploader = new DropboxUploader('sample-email@gmail.com', 'password');// enter dropbox credentials
$errors = array(); // to store errors.
// function definition
function copyDirRecursive($dir) {
global $uploader; // makes the "$uploader" below the one from outside the function
if(is_dir($dir)) { // added if/else to check if is dir, and create handle for while loop
$handle = opendir($dir);
if($handle === false) { // add if statements like this wherever you want to check for an error
$errors[] = $php_errormsg; // http://php.net/manual/en/reserved.variables.phperrormsg.php
}
} else {
return false;
}
while(false !== ($file = readdir($handle))) { // changed foreach to while loop
if(!isdir($file)) {
// copy the file
// cp $dir . '/' . $file to $dropbox . '/' . $dir . '/' . $file; // pseudocode
// below is actual code that hopefully will work
$uploader->upload($dir.$file,$dropboxdir.$file);
} else {
if(!is_link($file)) { // probably best not to follow symlinks, so we check that with is_link()
copyDirRecursive($dir . '/' . $file); // recursion time
}
}
}
}
// CALL THE FUNCTION
copyDirRecursive($dirtocopy); // you have to call a function for it to do anything
print_r($errors); // use this or var_dump($errors) to see what errors came up
Based on the code you have you want something along the lines of
require 'DropboxUploader.php';
$dirtocopy = './example_directory/';
$dropboxdir = '/backupdir/';
$uploader = new DropboxUploader('email@gmail.com', 'Password');// enter dropbox credentials
if ($handle = opendir($dirtocopy)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
$uploader->upload($dirtocopy.$entry, $dropboxdir.$entry);
}
}
closedir($handle);
}
I'm not 100% sure on the dropbox directory code as I've just pulled it out of your example and you may want to drop the first /
in $dropboxdir
. But I'm sure you can figure that out.
For reference the code for looping a directory is example #2 from http://php.net/manual/en/function.readdir.php
For recursive directory copying
require 'DropboxUploader.php';
function uploaddirtodropbox($dirtocopy, $dropboxdir, $uploader){
if ($handle = opendir($dirtocopy)) {
while (false !== ($entry = readdir($handle))) {
if ($entry != "." && $entry != "..") {
if(is_dir($entry)){
uploaddirtodropbox($dirtocopy.$entry.'/', $dropboxdir.$entry.'/', $uploader);
} else {
$uploader->upload($dirtocopy.$entry, $dropboxdir.$entry);
}
}
}
closedir($handle);
}
}
$dirtocopy = './example_directory/';
$dropboxdir = '/backupdir/';
$uploader = new DropboxUploader('email@gmail.com', 'Password');// enter dropbox credentials
uploaddirtodropbox($dirtocopy, $dropboxdir, $uploader);
In the question you have asked for help with using this https://github.com/jakajancar/DropboxUploader/ and I have given you code to do so, however if you read the github page it says
Its development was started before Dropbox released their API, and to
work, it scrapes their website. So you can and probably should use
their API now.
So it might be a good idea for you to look for an alternative.
Check out this answer maybe this is what You are looking for:
Dropbox API and PHP