В этом руководстве вы научитесь создавать WordPress плагин, с помощью которого ваши читатели смогут отправлять файлы на ваш Dropbox ящик прямо из записи или страницы на сайте. Это может быть удобно в таких случаях: например, вы организовали конкурс среди ваших читателей, и все желающие должны отправить вам свою работу таким образом, чтобы другие участники не видели ее до объявления результатов. Если вкратце, этот плагин позволяет загружать файлы в определенную папку вашего аккаунта Dropbox без публичного доступа.

Перед тем как приступить

Для выполнения этого урока вам понадобится зарегистрированный аккаунт Dropbox. Если у вас такого нет — зарегистрируйтесь. Вся процедура займет пару минут.

Вы можете загрузить уже готовый плагин по ссылке ниже. Ну а я приступлю к описанию шаг за шагом. Для создания плагина мы будем использовать класс загрузчика Dropbox от Jaka Jancar (под лицензией MIT).

Скачать исходники | Посмотреть демо

Мы будем создавать этот плагин, исходя из ситуации, описанной в первом абзаце. Предположим, вы организовали конкурс на "Лучший снимок рабочего стола" среди своих читателей. Каждый зарегистрированный читатель должен отправить вам свою работу. По истечении определенного времени вы отбираете лучшие работы и публикуете имена финалистов с их работами. Итак, давайте приступим!

Шаг 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 [jaka@kubje.org] [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.webania.net/dbouploader/
Description: Upload to Dropbox
Version: 1.0
Author: Elvin Haci
Author URI: http://www.webania.net
License: GPL2
*/
/*  Copyright 2011,  Elvin Haci  (email : elvinhaci@hotmail.com)

    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';
?>

Затем отредактируйте этот код: впишите свой email, пароль, папку 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']);

На этом все. Надеюсь, вам пригодится эта инструкция.

Источник: WP.tutsplus.com

Вам понравился материал?

Добавить комментарий

Такой e-mail уже зарегистрирован. Воспользуйтесь формой входа или введите другой.

Вы ввели некорректные логин или пароль

Извините, для комментирования необходимо войти.

16 комментариев

сначала новые
по рейтингу сначала новые по хронологии

ошибка Error: File size is too large or file type is not supported.
подскажите или лучше покажите на примере что прописать в настройках

С некоторых пор токен на dropbox не установлен, поэтому чтобы все работало без него необходимо внести некоторые исправления в код файла DropboxUploader.php, а именно, вот это блок кода должен выглядеть следующим образом:

protected function login() {
$data = $this->request('https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login');

// $token = $this->extractToken($data, '/login');
// $data = $this->request('https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login', true, array('login_email'=>$this->email, 'login_password'=>$this->password, 't'=>$token));

$data = $this->request('https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login" rel="nofollow" target="_blank">https://www.dropbox.com/login', true, array('login_email'=>$this->email, 'login_password'=>$this->password));

if (stripos($data, 'location: /home') === false)
throw new Exception('Login unsuccessful.');

$this->loggedIn = true;
}

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

Источник информации: http://forums.dropbox.com/topic.php?id=10849#post-412223

Изменил DropboxUploader.php согласно данному комментарию. Не работает.

Спасибо за полезную информацию!

Igor Tramp Art

Добрий день. Проболва пастроить плагин. При загрузке видает:
Error: Cannot create temporary directory!
Подскажите в чем проблема
линк на демо страничку
http://test3.tramp.org.ua/?page_id=28

Роман Світляр

Подскажыте пожулуста, можно ли применить етот плагин к обычному сайту? Спасибо большое!

Этот плагин применим только к WordPress, т.к. в своем исходном коде он задействует переменные и обращения к родным функциям WordPress.

Роман Світляр

Спасибо за быстрый ответ! Жаль, что нельзя. А может вам извесно о ресурсе с такими хорошыми плагины как у вас но для обычних сайтов?
Извените что затрагиваю етот вопрос на вашем блоге.

Добрый день !!! С шорткодом разобрался, теперь выдает ошибку такого плана - Error: Cannot extract token! (form action=https://dl-web.dropbox.com/upload). В чем может быть дело ???

Вы пишите: "Нужно в записи в любом месте, где хотите вставить эту форму, вписать шорткод ...". У меня вопрос, какую форму нужно вставить??? Ничего не понятно.

Форму для прикрепления и загрузки файлов на ящик Дропбокс. В любом месте в тексте записи с новой строки просто впишите
[dbouploader]
и при просмотре записи вы увидите кнопки для выбора и загрузки файлов.

что такое шорткод ? и в какое место вставлять?

Добрый день ! Я все сделал как описано у вас в статье, но у меня ничего не получается, выдаёт ошибку, можно подробнее написать, как правильно настроить и куда вставить шорткод ?

Нужно в записи в любом месте, где хотите вставить эту форму, вписать шорткод:

[dbouploader]

я установил плагин ,а как его всунуть что могли отправлять файлы?

Действительно, хороший вопрос! )

Нужно в записи в любом месте, где хотите вставить эту форму, вписать шорткод:

[dbouploader]