Подтвердить что ты не робот

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

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

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

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

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

Я использую:

  • Структура Codeigniter
  • jQuery как библиотека javascript

заблаговременно за любой ответ.

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

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

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

Ответ 2

from 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');
    }

from 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 не сообщает о завихрениях, поэтому вставьте в api и добавьте некоторый вывод, если он не работает.

Ответ 3

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

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

Сначала вам нужно будет включить их автозагрузчик, а затем добавить пространство имен 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.

Ответ 4

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

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

Затем проверьте этот простой класс интеграции. Кроме того, поместите в каталог библиотек. https://bitbucket.org/modomg/codeigniter-rackspace-cloudfiles

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