Rackspace cloud files: загрузка изображений в rackspace cloud files с использованием PHP - PullRequest
11 голосов
/ 06 февраля 2010

Я делаю проект, где пользователь может загружать изображения, такие как изображение профиля или изображение для своего изображения галереи прямо сейчас его загрузка всех изображений на мой сервер.

Теперь я хочу загрузить все это изображение в мои файлы в облаке стойки, используя скрипт php. Например:

  1. пользователь выбирает файл
  2. нажмите отправить с некоторой информацией
  3. выбранный файл будет загружен на сервер стойки и вернет местоположение файла.
  4. тогда местоположение файла вместе с другой информацией будет сохранено в моей базе данных.
  5. тогда я покажу файл или изображение из этого места.

так у тебя есть идеи, как именно я могу это сделать?

Я использую:

  • Рамка кодигнитора
  • jQuery как библиотека JavaScript

Заранее спасибо за любой ответ.

Ответы [ 4 ]

19 голосов
/ 08 февраля 2010

Обновление: хотя метод, который я опишу ниже, все еще будет работать, невозможно загрузить файлы напрямую, используя токены (спасибо DesignerGuy за эту информацию). Вы можете прочитать больше о том, как это сделать здесь . Следует также упомянуть, что такие сервисы, как transloadit , теперь упрощают подобные вещи, используя вставки jquery в формы HTML. Тем не менее, метод, который я опишу ниже, все еще работает и, вероятно, дает вам максимальный контроль.

Вы не можете напрямую загружать файлы в Rackspace Files, не пытаясь что-то вроде встраивания своих учетных данных Rackspace в форму. Даже если бы это было возможно, это не было бы хорошей идеей. (то есть пользователь может добавить массивный контент, используя ваши учетные данные, которые не имеют ничего общего с вашим приложением). Таким образом, чтобы получить то, что вы хотите, то есть, по сути, файл, хранящийся в Rackspace, и местоположение файла, хранящегося на вашем сервере, вам нужно изменить рабочий процесс. Это должно быть:

  1. Форма загрузки файла на ваш сервер-
  2. - ваш сервер - вычислил контейнер и имя файла, которые файл будет использовать
  3. - ваш сервер - загружает временный файл в файлы стойки

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

  1. - ваш сервер - разрешает передачу файла через CDN, создавая общедоступный URL-адрес для файла, к которому ваш пользователь может получить доступ.
  2. когда ваш сервер создает html, он встраивает URL-адреса CDN, и пользователь волшебным образом получает файлы

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

  1. - ваш сервер - аутентифицируется с помощью стойки и временно загружает файл
  2. - ваш сервер - обслуживает файл И HTML с вашего сервера

Вы не платите за пропускную способность между файлами -your server- и rackspace, если -your server- также является экземпляром Rackspace Cloud или обычным Rackspace Managed Server (или, по крайней мере, так сказала служба поддержки клиентов). Важный факт при расчете ставок между Amazon и Rackspace.

Таким образом, вы можете использовать Rackspace Files в качестве массивного жесткого диска для вашего сервера, который дает вам контроль над доступом, или вы можете использовать его в качестве массовой общедоступной распределительной сети ... Но в обоих случаях вам может потребоваться изменить порядок ваших шагов, чтобы дать вам то, что вы хотите ...

Вы также можете посмотреть на простой пример использования php для загрузки файла, собранного из формы HTML, в файлы стойки .

1 голос
/ 03 апреля 2014

Многие из этих ответов старые и смотрят на Ответ Орбиты Я думаю, что с тех пор в API было много изменений. И поскольку ftrotter уже объяснил о попытке загрузки напрямую, я покажу вам обновленную версию (стиль PHP 5.3) о том, как отправлять файлы из каталога PHP tmp.

Сначала предположим, что вы уже установили API с помощью composer.

Сначала вам нужно включить их автозагрузчик, а затем добавить пространство имен use.

require 'vendor/autoload.php';

use OpenCloud\Rackspace as Rackspace;

Затем вы просто настраиваете экземпляр клиента

// first setup the client using your portal username and API key
$client = new Rackspace(Rackspace::US_IDENTITY_ENDPOINT, array(
    'username' => 'YOUR-USERNAME',
    'apiKey'   => 'YOUR-API-KEY'
));

$region = 'DFW'; // can be ORD or various others and must be set

// now get the container
$container = $client->objectStoreService('cloudFiles', $region)
    ->getContainer('YOUR-CONTAINER');

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

if (isset($_FILES)) {
    $files = array();
    foreach ($_FILES as $file) {
        if (0 === $file['error']) {
            $files[] = array(
                'name' => $file['name'],
                'path' => $file['tmp_name']
            );
        }
    }

    if (count($files)) {
        // upload files to Rackspace Cloud Files container
        $result = $container->uploadObjects($files);
    }
}

Теперь ваши файлы сохранят свои существующие имена, когда они окажутся в контейнере, и вы сможете получить путь к общедоступному URL-адресу вашего контейнера прямо из портала Rackspace Cloud.

1 голос
/ 04 августа 2010

из welcome.php:

    function index()
    {
            if(!empty($_FILES)){
                    require('system/libraries/cloudfiles.php');
                    $upload_dir = 'upload/doc/2';
                    $tmp_name = $_FILES['upload']['tmp_name'];
                    $name = $_FILES['upload']['name'];
                    move_uploaded_file($tmp_name,"$upload_dir/$name");
                    $username = 'ABC';
                    $key = 'X';
                    $auth = new CF_Authentication($username, $key);
                    $auth->authenticate();
                    $conn = new CF_Connection($auth);
                    $container = $conn->get_container('documents');
                    $localfile = "$upload_dir/$name";
                    $object = $container->create_object($name);
                    $object->load_from_filename($localfile);
            }
            $this->load->view('global_header');
            $this->load->view('welcome_message');
    }

из welcome_message.php:

<form method="post" action="#" enctype="multipart/form-data"s>
<input type="file" name="upload"><br/>
<input type="submit">
</form>

проблем, с которыми я столкнулся:

cacert.pem ~ Этот файл должен находиться в вашем веб-каталоге и поставляется с API.

вам может понадобиться fileinfo из pecl, и для этого вам может понадобиться libmagic (если у вас его еще нет).

вам также нужен пакет php5-curl, и php не сообщает об ошибках curl, поэтому покопайтесь в API и добавьте вывод, если он не работает.

0 голосов
/ 26 июня 2011

Я только что закончил с чем-то похожим. Я думал, что добавлю свои выводы в этот пост.

Сначала поместите пакет cloudfiles в каталог приложения / библиотеки: https://github.com/rackspace/php-cloudfiles

Тогда посмотрите этот простой класс интеграции. Также разместите в каталоге библиотеки. https://bitbucket.org/modomg/codeigniter-rackspace-cloudfiles

Ура, Джефф Уолтерс

...