Rackspace cloud files: Image Upload to rackspace cloud files using PHP
Asked Answered
I

4

12

I am doing a project where user can upload images like profile image or image for their image gallary. right now its uploading all the images to my server.

Now, i want to upload all this image to my rackspace cloud files directly using php script. For example:

  1. user select a file
  2. press submit with some information
  3. the selected file will be uploaded to the rackspace server and return the file location.
  4. then the file location along with other information will be saved in my database.
  5. then i will show the file or image from that location.

so do u have any idea, exactly how i can do this?

i am using:

  • Codeigniter framework
  • jQuery as javascript library

thanks in advance for any answer.

Infarction answered 6/2, 2010 at 20:6 Comment(0)
S
19

Update: Although the method that I describe below will still work, it is not possible to upload files directly using tokens (thanks to DesignerGuy for that info). You can read more about how to do that here. I should also mention that services like transloadit now make this sort of thing trivially easy using jquery inserts into HTML forms. Still the method that I describe below still works and probably gives you the most control.

You cannot load files -directly- to Rackspace Files, without trying something like embedding your Rackspace credentials into the form. Even if this were possible it would not be a good idea. (i.e. the user could add massive content using your credentials that have nothing to do with your application). So to get what you want, which is essentially to have the file stored at Rackspace, and the location of the file stored in your server you need to modify your work flow. It needs to be:

  1. Form uploads file to -your server-
  2. -your server- calculated the container and filename that the file will use
  3. -your server- uploads the temporary file to rackspace files

If you want the file to be publically downloadable...

  1. -your server- enables the file to be served via the CDN, making a public URL for the file that your user can access.
  2. when your server creates html it embeds the CDN urls and the user magically gets the files

If you want the file to be only downloadable by -certain- users....

  1. -your server- authenticates with rackspace and downloads the file temporarily
  2. -your server- serves the file AND the HTML both from your server

You do not pay for bandwidth between -your server- and rackspace files, if -your server- is also a rackspace cloud instance or a regular Rackspace Managed Server (or at least that is what customer support has told me). An important fact when calculating the rates between Amazon and Rackspace.

So you can either use Rackspace Files as a massive hard-drive for your server, which gives you control over access, or you can use it as a massive public distribution network... But in both cases you might need to change the order of your steps to give you what you want...

You might also look at a simple example of using php to upload a file gathered from an HTML form to rackspace files.

Svelte answered 8/2, 2010 at 15:41 Comment(2)
Great answer - thanks! Will have to check for that simple example elsewhere (account suspended). Maybe it's on the Wayback Machine. In my case I have an iOS app that I would prefer post files directly to Rackspace Files. Of course we can't have the access key in the app! I recall Facebook used to have a mechanism by which a token could be generated on a server (via SSL request) and then used by the app for a limited time. It was never saved out in the open (only to the secure keychain). Perhaps there's a way to do that for Rackspace Files? I wouldn't even save the token. Just use it as needed.Sottish
You CAN upload a file directly to cloudfiles now. You create a token/signature for the request and can use a form to submit directly. See docs.rackspace.com/files/api/v1/cf-devguide/content/…Facetious
V
2

A lot of these answers are old and looking at Orbit's answer I think there must have been many changes to the API since then. And since ftrotter already explained about trying to upload directly, I will show you an updated version (PHP 5.3 style) of how to send the files from the PHP tmp directory.

First we'll assume you already installed the API using composer.

First you'll need to include their autoloader and then add the use namespace.

require 'vendor/autoload.php';

use OpenCloud\Rackspace as Rackspace;

Then you simply setup the client instance

// 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');

Now that you have your container you can simply setup your array of files and upload them. Here's a quick and dirty way:

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

Now you your files will keep their existing names when they end up in the container, and you can get the public URL path for your container right from within the Rackspace Cloud portal.

Valdemar answered 3/4, 2014 at 18:49 Comment(2)
It's not working and says "Missing argument 2 for OpenCloud\ObjectStore\Resource\Container::uploadObject(),"Footloose
@Footloose It should be uploadObjects() (plural). My example uses uploadObjects() Let me know if that helpsValdemar
C
1

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>

problems I encountered:

cacert.pem ~ This file needs to go in your web directory and comes with the api.

you may need fileinfo from pecl, and for this you may need libmagic (if you don't have it already).

you also need the package php5-curl , and php doesn't report curl errors, so dig into the api and add some output if it isn't working.

Chafin answered 4/8, 2010 at 2:16 Comment(0)
B
0

I just got done with something similar. I thought I'd add my findings to this post.

First, place the cloudfiles package in your application/libraries directory: https://github.com/rackspace/php-cloudfiles

Then check out this simple integration class. Also, place in libraries directory. https://bitbucket.org/modomg/codeigniter-rackspace-cloudfiles

Cheers, Jeff Walters

Bering answered 26/6, 2011 at 16:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.