Я хотел бы создать PHP-скрипт для резервного копирования файлов из определенного каталога на моем веб-сайте в мою учетную запись Dropbox.
Я попытался найти примеры и как обойти это, но я только нашел код для резервного копирования баз данных или для покупки готовых решений.
Это код, который я пробовал
<?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); } ?>
Но вместо того, чтобы загружать изображение с моего ПК на Dropbox через мой сайт. Я хочу изменить приведенный выше код для копирования файлов в определенном каталоге на моем сайте в Dropbox.
Вам нужен рекурсивный код.
Напишите функцию, которая принимает в качестве аргумента dir.
Проведите петлю в директории, просматривая каждый файл. Для каждого файла он проверяет, является ли это директором, а если нет, он копирует его.
Если это каталог, функция вызывает себя.
например
// 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
На основе кода, который у вас есть, вы хотите что-то вроде
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); }
Я не уверен на 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@gmail.com', 'Password');// enter dropbox credentials uploaddirtodropbox($dirtocopy, $dropboxdir, $uploader);
В вопросе, который вы попросили о помощи в использовании этого https://github.com/jakajancar/DropboxUploader/, и я дал вам код для этого, однако, если вы читаете страницу github, это говорит
Его разработка была начата до того, как Dropbox выпустила свой API, и для работы он скрестил свой веб-сайт. Таким образом, вы можете и, вероятно, должны использовать свой API сейчас.
Поэтому вам может быть хорошей идеей искать альтернативу.
Проверьте этот ответ, возможно, это то, что вы ищете:
API Dropbox и PHP