Облачные файлы Rackspace:Загрузка изображений в облачные файлы rackspace с использованием PHP

StackOverflow https://stackoverflow.com/questions/2214540

Вопрос

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

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

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

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

я использую:

  • Фреймворк Codeigniter
  • jQuery как библиотека javascript

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

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

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

Другие советы

из 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 и добавьте некоторые выходные данные, если это не работает.

Многие из этих ответов устарели и выглядят Ответ Орбиты Я думаю, что с тех пор в 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.

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

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

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

Ваше здоровье, Джефф Уолтерс

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top