Monday, 06 August 2012 17:39

Создаем WordPress плагин который позволяет загружать файлы в папку Dropbox

Сегодня мы напишем плагин, который позволяет пользователям отправлять свои файлы к вам в папку Dropbox. Это может быть полезно например, если вы предоставите конкурс для ваших читателей и они возможно, должны будут отправить вам некоторые файлы. Короче говоря, этот плагин предназначен для получения файлов, которые не будут обнародованы.

Прежде чем мы начнем

Вы можете скачать готовый плагин через кнопку Скачать внизу этой статьи. Теперь мы опишем наш плагин шаг за шагом. Мы будем использовать Jaka Jancar‘s Dropbox Uploader класс (под MIT лицензией) для создания плагина. Предположим, что вы делаете конкурс на «Лучшее Фото" для ваших пользователей. Каждый зарегистрированный пользователь сайта может отправить его фото к вам в папку Dropbox. Итак, начнем строить наш плагин!

Шаг 1 Создание первого файла

Создайте папку под названием dbuploader в директории wp-content/plugins. Создайте новый файл PHP под именем DropboxUploader.php откройте его в текстовом редакторе и вставьте этот код:

<?php
/**
 * Dropbox Uploader
 *
 * Copyright (c) 2009 Jaka Jancar
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @author Jaka Jancar [http://jaka.kubje.org/]
 * @version 1.1.5
 */
class DropboxUploader {
    protected $email;
    protected $password;
    protected $caCertSourceType = self::CACERT_SOURCE_SYSTEM;
    const CACERT_SOURCE_SYSTEM = 0;
    const CACERT_SOURCE_FILE = 1;
    const CACERT_SOURCE_DIR = 2;
    protected $caCertSource;
    protected $loggedIn = false;
    protected $cookies = array();
 
    /**
     * Constructor
     *
     * @param string $email
     * @param string|null $password
     */
    public function __construct($email, $password) {
        // Check requirements
        if (!extension_loaded('curl'))
            throw new Exception('DropboxUploader requires the cURL extension.');
 
        $this->email = $email;
        $this->password = $password;
    }
 
    public function setCaCertificateFile($file)
    {
        $this->caCertSourceType = self::CACERT_SOURCE_FILE;
        $this->caCertSource = $file;
    }
 
    public function setCaCertificateDir($dir)
    {
        $this->caCertSourceType = self::CACERT_SOURCE_DIR;
        $this->caCertSource = $dir;
    }
 
    public function upload($filename, $remoteDir='/') {
        if (!file_exists($filename) or !is_file($filename) or !is_readable($filename))
            throw new Exception("File '$filename' does not exist or is not readable.");
 
        if (!is_string($remoteDir))
            throw new Exception("Remote directory must be a string, is ".gettype($remoteDir)." instead.");
 
        if (!$this->loggedIn)
            $this->login();
 
        $data = $this->request('https://www.dropbox.com/home');
        $token = $this->extractToken($data, 'https://dl-web.dropbox.com/upload');
 
        $data = $this->request('https://dl-web.dropbox.com/upload', true, array('plain'=>'yes', 'file'=>'@'.$filename, 'dest'=>$remoteDir, 't'=>$token));
        if (strpos($data, 'HTTP/1.1 302 FOUND') === false)
            throw new Exception('Upload failed!');
    }
 
    protected function login() {
        $data = $this->request('https://www.dropbox.com/login');
        $token = $this->extractToken($data, '/login');
 
        $data = $this->request('https://www.dropbox.com/login', true, array('login_email'=>$this->email, 'login_password'=>$this->password, 't'=>$token));
 
        if (stripos($data, 'location: /home') === false)
            throw new Exception('Login unsuccessful.');
 
        $this->loggedIn = true;
    }
 
    protected function request($url, $post=false, $postData=array()) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
        switch ($this->caCertSourceType) {
            case self::CACERT_SOURCE_FILE:
                curl_setopt($ch, CURLOPT_CAINFO, $this->caCertSource);
                break;
            case self::CACERT_SOURCE_DIR:
                curl_setopt($ch, CURLOPT_CAPATH, $this->caCertSource);
                break;
        }
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        if ($post) {
            curl_setopt($ch, CURLOPT_POST, $post);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
        }
 
        // Send cookies
        $rawCookies = array();
        foreach ($this->cookies as $k=>$v)
            $rawCookies[] = "$k=$v";
        $rawCookies = implode(';', $rawCookies);
        curl_setopt($ch, CURLOPT_COOKIE, $rawCookies);
 
        $data = curl_exec($ch);
 
        if ($data === false)
            throw new Exception('Cannot execute request: '.curl_error($ch));
 
        // Store received cookies
        preg_match_all('/Set-Cookie: ([^=]+)=(.*?);/i', $data, $matches, PREG_SET_ORDER);
        foreach ($matches as $match)
            $this->cookies[$match[1]] = $match[2];
 
        curl_close($ch);
 
        return $data;
    }
 
    protected function extractToken($html, $formAction) {
        if (!preg_match('/<form [^>]*'.preg_quote($formAction, '/').'[^>]*>.*?(<input [^>]*name="t" [^>]*value="(.*?)"[^>]*>).*?<\/form>/is', $html, $matches) || !isset($matches[2]))
            throw new Exception("Cannot extract token! (form action=$formAction)");
        return $matches[2];
    }
} 

Шаг 2 строим основной файл плагина

Создайте основной файл плагина под названием dbuploader.php в той же папке; откройте его в вашем редакторе и вставьте и сохраните этот код:

<?php
/**
* Plugin Name: DboUploader - Dropbox upload
* Plugin URI: http://www.clasny.com/dbouploader/
* Description: Upload to Dropbox
* Version: 1.0
* Author: Clasny
* Author URI: http://www.clasny.com/
* License: GPL2
 
   *  Copyright 2011,  Clasny 
 
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License, version 2, as
   *  published by the Free Software Foundation.
 
   * This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
 
   *  You should have received a copy of the GNU General Public License
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/
 
function dbouploader($content = '') {
 
  if (is_user_logged_in())  add_shortcode('dbouploader', 'shortcoder');
  else add_shortcode('dbouploader', 'notloggedin');
  return $content;
}
 
function notloggedin($atts,$content = '') {
return 'You must be logged in!';
}
 
function shortcoder($atts,$content = '') {
 
 //////////////////
define("dboconf","1");
include(WP_PLUGIN_DIR . "/" . plugin_basename(dirname(__FILE__))."/config.php");
 
if ($_POST) {
 
include(WP_PLUGIN_DIR . "/" . plugin_basename(dirname(__FILE__))."/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.');
 
    if(  !in_array($_FILES["file"]["type"],$supported_types) or $_FILES["file"]["size"] > $size_limit)
   throw new Exception('File size is too large or file type is not supported.');
 
        $tmpDir = uniqid('/tmp/DropboxUploader-');
        if (!mkdir($tmpDir))
            throw new Exception('Cannot create temporary directory!');
 
        if ($_FILES['file']['name'] === "")
            throw new Exception('File name not supplied by the browser.');
      global $current_user;
      get_currentuserinfo();
 
        $tmpFile = $tmpDir.'/'.str_replace("/\0", '_', $current_user->user_email.'_'.$_FILES['file']['name']);
        if (!move_uploaded_file($_FILES['file']['tmp_name'], $tmpFile))
            throw new Exception('Cannot rename uploaded file!');
 
        // Enter your Dropbox account credentials here
    $uploader = new DropboxUploader($dropbox_email, $dropbox_password);
        $uploader->upload($tmpFile, $_POST['dest']);
 
        return '<span style="color: green;font-weight:bold;margin-left:0px;">File successfully uploaded. Thank you!</span>';
    } catch(Exception $e) {
        return '<span style="color: red;font-weight:bold;margin-left:0px;">Error: ' . htmlspecialchars($e->getMessage()) . '</span>';
    }
 
    // Clean up
    if (isset($tmpFile) && file_exists($tmpFile))
        unlink($tmpFile);
 
    if (isset($tmpDir) && file_exists($tmpDir))
        rmdir($tmpDir);
 
}
else {
return '
<div class="box" align="center">
    <h1>Dropbox Uploader Demo<br>
    </h1>
    <form method="POST" enctype="multipart/form-data">
    <input type="file" name="file" /><br><br>
    <input type="submit" value="Upload your file!" />
    <input style="display:none" type="text" name="dest" value="'.$dropbox_folder.'" />
</div>  ';
}
  ////////////////
 }
 
add_action('the_content', 'dbouploader');
?> 

Шаг 3 Завершаем работу:

Создайте файл config.php в папке плагина, а затем вставьте этот код:

<?php
if(!defined('dboconf')){die();}
$dropbox_email=''; // YOUR DROPBOX EMAIL
$dropbox_password=''; // YOUR DROPBOX PASSWORD
$dropbox_folder='shared';
$supported_types=array('image/png','image/jpeg');
$size_limit='512000';
?> 

Затем измените этот код: вставьте вашу электронную почту, пароль, Dropbox папку, размер файлов, поддерживаемые типы файлов, и сохраните.

Некоторые предложения:

Предложение 1:

Если вы хотите сделать доступной загрузку для всех пользователей, не только для авторизованных, то вы можете редактировать код ...

if (is_user_logged_in())  add_shortcode('dbouploader', 'shortcoder'); 

... Вы можете интегрировать ReCaptcha с вашим плагином.

Предложение 2:

Вы можете также изменить имя формата загружаемых файлов. Просто измените эту строку:

$tmpFile = $tmpDir.'/'.str_replace("/\0", '_', $current_user->user_email.'_'.$_FILES['file']['name']); 

Вот и все, Удачи!

Скачать

Прочитано 1974 раз