Post Top Ad

Your Ad Spot

viernes, 15 de mayo de 2020

Copia de seguridad en Dropbox con PHP

Recientemente he estado buscando en la API de Dropbox, así que decidí intentar crear una aplicación que pueda cargar un archivo o una carpeta completa directamente a Dropbox.
Para seguir adelante, deberá crear una aplicación en Dropbox https://www.dropbox.com/developers/apps/create
  • Crear una aplicación de API de Dropbox: esto permitirá el acceso a la API principal
  • El tipo debe ser Archivos y almacenes de datos.
  • Limite la aplicación a su propia carpeta
  • Dale a la aplicación un nombre único
Una vez que se haya creado la aplicación, haga clic en Generar token de acceso y guárdela, se usará más adelante. La autenticación de usuario no será necesaria para esta aplicación.
Ahora que se ha creado la aplicación de Dropbox, se necesitará el Core API SKD para PHP, se puede descargar desde https://www.dropbox.com/developers/core/sdks/php , en esta guía usaré el compositor. de descargarlo manualmente.

Aplicación PHP

La aplicación php ahora está lista para ser creada, crear una carpeta de proyecto, llamaré al mío dropboxbckup.
En su carpeta de proyecto, cree estos archivos:
  • backup.php
  • composer.json
  • index.php
Abra composer.json y ponga:
{
    "require": {
        "php": ">=5.3.0",
        "dropbox/dropbox-sdk": "1.1.*"
    }
}
A continuación, abra un símbolo del sistema / terminal y navegue hasta el proyecto e ingrese la instalación del compositor, esto instalará todas las dependencias necesarias, en este caso descargará el SKD de Dropbox en un directorio de proveedores.
Si no tiene instalado Composer, no podrá seguir el paso anterior, en cuyo caso instale Composer: Instrucciones de instalación de Composer: https://getcomposer.org/doc/00-intro.md#globally
A continuación, abra index.php, cargue el archivo de carga automática del proveedor si existe, si no imprime un error:
<?php
if(file_exists('vendor/autoload.php')){
    require 'vendor/autoload.php';


} else {
    echo "<h1>Please install via composer.json</h1>";
    echo "<p>Install Composer instructions: <a href='https://getcomposer.org/doc/00-intro.md#globally'>https://getcomposer.org/doc/00-intro.md#globally</a></p>";
    echo "<p>Once composer is installed navigate to the working directory in your terminal/command prompt and enter 'composer install'</p>";
    exit;
}
Después de requerir la clase de carga automática, agregue otro requerimiento para backup.php, esta será la clase que usa la API de Dropbox
Cree una variable llamada $ token e ingrese su token de acceso (generado por Dropbox cuando creó la aplicación). También cree las variables $ project y $ projectFolder.
$ project debe contener el nombre del proyecto y un número de versión
$ projectFolder: una carpeta donde todas las cargas se almacenan en la aplicación / dropboxapp / foldername de esta manera, puede usar la misma aplicación para varios servidores y saber de qué proyecto se trata cada carpeta.
require 'vendor/autoload.php';
require 'backup.php';    

//set access token
$token = 'Your access token here';
$project = 'dropboxbackup/1.0';
$projectFolder = 'localserver';
A continuación, cree una nueva instancia de una clase de copia de seguridad y pásele el token, el proyecto y la carpeta de proyectos. La siguiente línea (comentada) le dice al script lo que desea cargar, ya sea un archivo de una carpeta.
$bk = new Backup($token,$project,$projectFolder);
//$bk->upload('index.php');

index.php completado:

<?php
if(file_exists('vendor/autoload.php')){
    require 'vendor/autoload.php';
    require 'backup.php';    

    //set access token
    $token = 'Your access token here';
    $project = 'dropboxbackup/1.0';
    $projectFolder = 'localserver';

    $bk = new Backup($token,$project,$projectFolder);
    //$bk->upload('index.php');

    echo 'Upload Complete';

} else {
    echo "<h1>Please install via composer.json</h1>";
    echo "<p>Install Composer instructions: <a href='https://getcomposer.org/doc/00-intro.md#globally'>https://getcomposer.org/doc/00-intro.md#globally</a></p>";
    echo "<p>Once composer is installed navigate to the working directory in your terminal/command prompt and enter 'composer install'</p>";
    exit;
}

backup.php

A continuación, abra backup.php.
El nombre de la clase siempre debe ser el mismo que el nombre del archivo:
class Backup {
Luego cree 2 propiedades privadas, $ dbxClient y $ projectFolder.
$ dbxClient será el objeto de Dropbox para interactuar con la API
Cree un método de construcción que recopilará el proyecto de token y projectFolder de la página index.php. Se creará una nueva instancia de la clase de Dropbox Client utilizando el token para autenticar su acceso y proyecto para decirle a la API el nombre y la versión del proyecto.
private $dbxClient;
private $projectFolder;

public function __construct($token,$project,$projectFolder){
    $this->dbxClient = new Dropbox\Client($token, $project);
    $this->projectFolder = $projectFolder;
}
A continuación, se creará un método llamado upload, esto esperará $ dirtocopy, este es un archivo o una carpeta.
Si el archivo o carpeta no existe, el script se cerrará con un mensaje.
si $ dirtocopy es un archivo, se pasará a un método uploadFile; de ​​lo contrario, se crea un nuevo RecursiveIteratorIterator para recopilar todas las carpetas y archivos, ignorando los archivos que comienzan con puntos e ignorando cualquier archivo o carpeta que no tenga permiso.
Luego, los archivos se repiten y se comparan con una lista de ignorados; si no se encuentra ninguna coincidencia, el archivo se pasa al método uploadFile.
public function upload($dirtocopy){

    if(!file_exists($dirtocopy)){

        exit("File $dirtocopy does not exist");
        
    } else {

        //if dealing with a file upload it
        if(is_file($dirtocopy)){
            $this->uploadFile($dirtocopy);
               
        } else { //otherwise collect all files and folders

            $iter = new \RecursiveIteratorIterator(
                new \RecursiveDirectoryIterator($dirtocopy, \RecursiveDirectoryIterator::SKIP_DOTS),
                \RecursiveIteratorIterator::SELF_FIRST,
                \RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
            );

            //loop through all entries
            foreach($iter as $file) {

                $words = explode('/',$file);
                $stop = end($words);    

                //if file is not in the ignore list pass to uploadFile method
                if(!in_array($stop, $this->ignoreList())){
                    $this->uploadFile($file);
                }

            }
        }
    }
}

public function ignoreList(){
    return array(
        '.DS_Store',
        'cgi-bin'
    );
}
El método uploadFile recopila el archivo y lo pasa al método uploadFile de Dropbox pasando el nombre de la carpeta del proyecto seguido del archivo.
Cada archivo cargado será único; si ya existe un archivo con el mismo nombre, se agregará un número al nombre del archivo.
Para que Dropbox reemplace el archivo existente, abra vendor / dropbox / dropbox-sdk / lib / Dropbox / WriteMode.php en la línea 48 reemplace false a true en la opción de sobrescritura:
static function add()
{
    if (self::$addInstance === null) {
        self::$addInstance = new WriteMode(array("overwrite" => "true"));
    }
    return self::$addInstance;
}
public function uploadFile($file){
    $f = fopen($file, "rb");
    $this->dbxClient->uploadFile("/".$this->projectFolder."/$file", Dropbox\WriteMode::add(), $f);
    fclose($f);
}

Complete backup.php:

<?php

class Backup {

    private $dbxClient;
    private $projectFolder;

    /**
     * __construct pass token and project to the client method
     * @param string $token  authorization token for Dropbox API 
     * @param string $project       name of project and version
     * @param string $projectFolder name of the folder to upload into
     */
    public function __construct($token,$project,$projectFolder){
        $this->dbxClient = new Dropbox\Client($token, $project);
        $this->projectFolder = $projectFolder;
    }

    /**
     * upload set the file or directory to upload
     * @param  [type] $dirtocopy [description]
     * @return [type]            [description]
     */
    public function upload($dirtocopy){

        if(!file_exists($dirtocopy)){

            exit("File $dirtocopy does not exist");
            
        } else {

            //if dealing with a file upload it
            if(is_file($dirtocopy)){
                $this->uploadFile($dirtocopy);
                   
            } else { //otherwise collect all files and folders

                $iter = new \RecursiveIteratorIterator(
                    new \RecursiveDirectoryIterator($dirtocopy, \RecursiveDirectoryIterator::SKIP_DOTS),
                    \RecursiveIteratorIterator::SELF_FIRST,
                    \RecursiveIteratorIterator::CATCH_GET_CHILD // Ignore "Permission denied"
                );

                //loop through all entries
                foreach($iter as $file) {

                    $words = explode('/',$file);
                    $stop = end($words);    

                    //if file is not in the ignore list pass to uploadFile method
                    if(!in_array($stop, $this->ignoreList())){
                        $this->uploadFile($file);
                    }

                }
            }
        }
    }

    /**
     * uploadFile upload file to dropbox using the Dropbox API
     * @param  string $file path to file
     */
    public function uploadFile($file){
        $f = fopen($file, "rb");
        $this->dbxClient->uploadFile("/".$this->projectFolder."/$file", Dropbox\WriteMode::add(), $f);
        fclose($f);
    }

    /**
     * ignoreList array of filenames or directories to ignore
     * @return array 
     */
    public function ignoreList(){
        return array(
            '.DS_Store',
            'cgi-bin'
        );
    }
}

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas