Статьи

Простой плагин, который позволяет пользователям загружать файлы в папку Dropbox

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


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

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


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

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?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.
 * 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 [[email protected]] [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];
    }
}

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

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
<?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 : [email protected])
 
    This program is free software;
    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;
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
    along with this program;
    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.
    } catch(Exception $e) {
        return ‘<span style=»color: red;font-weight:bold;margin-left:0px;»>Error: ‘ .
    }
 
    // 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’);
?>

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

1
2
3
4
5
6
7
8
<?php
if(!defined(‘dboconf’)){die();}
$dropbox_email=»;
$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 с вашим плагином.

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

1
$tmpFile = $tmpDir.’/’.str_replace(«/\0», ‘_’, $current_user->user_email.’_’.$_FILES[‘file’][‘name’]);

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