2013-03-12 3 views
2

Я хотел бы создать PHP-скрипт для резервного копирования файлов из определенного каталога на моем веб-сайте в мою учетную запись Dropbox.Как создавать резервные копии файлов из определенного каталога в Dropbox только с помощью PHP?

Я попытался найти примеры и как обойти его, но я нашел код для резервного копирования баз данных или для покупки готовых решений.

Это код, который я попытался

<?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('[email protected]', '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); 
} 
?> 

Но вместо загрузки изображения с моего компьютера на Dropbox через мой сайт. Я хочу изменить приведенный выше код для копирования файлов в определенном каталоге на моем сайте в Dropbox.

+1

Вот руководство по использованию dropbox с php http://www.dropbox-php.com/, но никто здесь не сделает вашу работу за вас. Люди с большей вероятностью помогут, если вы покажете, что у вас есть, и дайте примеры кода. –

+0

Привет, Джейкоб. Я поднял свой вопрос с помощью кода, который я пытаюсь использовать, чтобы найти решение для моего запроса. – maltadolls

+0

Мне нужен рекурсивный код. Я полагаю, функция $ uploader-> upload() не сходит с дерева каталогов. См. Мой ответ. Думаю, это сработает для вас. Вам просто нужно смоделировать свой код после моего шаблона. –

ответ

-1

Заканчивать этот ответ может быть, это то, что вы ищете:

Dropbox API and PHP

+0

Публикация ссылки недействительный. Это должен быть комментарий. –

+0

Я попробовал - это слишком сложно, потому что ему нужны PHP OAuth и HTTP_OAUTH PEAR. Я попробовал это раньше. Это не сработало, и это слишком сложно. Я искал простое решение, например, используя собственное имя пользователя и пароль вместо того, чтобы делать приложение Dropbox с API. – maltadolls

1

на основе кода у вас есть вы хотите что-то вдоль линий

require 'DropboxUploader.php'; 

$dirtocopy = './example_directory/'; 
$dropboxdir = '/backupdir/'; 
$uploader = new DropboxUploader('[email protected]', 'Password');// enter dropbox credentials 

if ($handle = opendir($dirtocopy)) { 
    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 

      $uploader->upload($dirtocopy.$entry, $dropboxdir.$entry); 

     } 
    } 
    closedir($handle); 
} 

Я не 100% уверен в коде каталога Dropbox, поскольку я только что вытащил его из вашего примера, и вы можете отказаться от первого / в $dropboxdir. Но я уверен, что вы можете это понять.

Для справки код для зацикливания каталога является пример # 2 из http://php.net/manual/en/function.readdir.php

Для рекурсивного каталога копирования

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 protected]', 'Password');// enter dropbox credentials 

uploaddirtodropbox($dirtocopy, $dropboxdir, $uploader); 

В вопросе вы попросили о помощи с использованием этого https://github.com/jakajancar/DropboxUploader/, и я дал вам код для этого, однако, если вы читаете страницу github, то это говорит

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.

Так что это может быть хорошей идеей для вы ищете альтернативу.

+0

Спасибо Jackob. Я попробую это позже, когда я буду дома. Я скажу вам результат. Я ценю вашу помощь. – maltadolls

+1

Привет, Jackob. Он отлично работал. Все, что мне нужно сделать, это скорректировать $ dirtocopy для копирования файлов из другого каталога на том же уровне (тот же самый родитель). – maltadolls

+0

Отлично, я рад, что смогу помочь. –

2

Вам нужен рекурсивный код.

Напишите функцию, которая берет директорию в качестве аргумента.

Пробейте ли он петлю в каталоге, глядя на каждый файл. Для каждого файла он проверяет, является ли это директором, а если нет, он копирует его.

Если это реж, функция вызывает себя.

например.

// your code 
require 'DropboxUploader.php'; 

$dirtocopy = './example_directory/'; 
$dropboxdir = 'backupdir/'; 
$uploader = new DropboxUploader('[email protected]', '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 
+0

Как я могу интегрировать его в мой код выше? – maltadolls

+0

Хорошо, я добавил. Это была только одна строка. Дайте мне знать, если это сработает. –

+0

Кроме того, вы можете изменить функцию $ uploader-> upload() для обработки самой рекурсии ... вот что я, вероятно, сделаю. Но я не знаю, как выглядит эта функция. Вышеприведенный код должен работать. И если вы подумаете об этом несколько минут, я уверен, что вы можете понять, как добавить функциональность в метод upload(). –