How to backup files from a specific directory to D

2019-02-11 03:38发布

问题:

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.

回答1:

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


回答2:

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.



回答3:

Check out this answer maybe this is what You are looking for:

Dropbox API and PHP