2010-02-06 26 views
11

Estoy haciendo un proyecto donde el usuario puede cargar imágenes como imagen de perfil o imagen para su gallary de imagen. en este momento está cargando todas las imágenes a mi servidor.Archivos en la nube de Rackspace: carga de imágenes en archivos de la nube de rackspace usando PHP

Ahora, quiero subir toda esta imagen a mis archivos en la nube de rackspace directamente usando php script. Por ejemplo:

  1. usuario seleccionar un archivo
  2. pulse enviar alguna información
  3. el archivo seleccionado se carga en el servidor de espacio de rack y devolver la ubicación del archivo.
  4. luego la ubicación del archivo junto con otra información se guardará en mi base de datos.
  5. luego mostraré el archivo o la imagen de esa ubicación.

¿Tienes alguna idea, exactamente cómo puedo hacer esto?

estoy usando: Marco

  • CodeIgniter
  • jQuery como librería javascript

gracias de antemano por cualquier respuesta.

Respuesta

19

Actualización: Aunque el método que describo a continuación seguirá funcionando, no es posible cargar archivos directamente usando tokens (gracias al DesignerGuy para esa información). Puede leer más sobre cómo hacerlo here. También debo mencionar que los servicios como transloadit ahora hacen que este tipo de cosas sea trivialmente fácil usando las inserciones de jquery en formularios HTML. De todos modos, el método que describo a continuación sigue funcionando y probablemente te dé más control.

No puede cargar archivos -directamente- en los archivos de Rackspace, sin intentar algo así como incrustar sus credenciales de Rackspace en el formulario. Incluso si esto fuera posible, no sería una buena idea. (es decir, el usuario podría agregar contenido masivo utilizando sus credenciales que no tienen nada que ver con su aplicación). Entonces, para obtener lo que desea, que es esencialmente tener el archivo almacenado en Rackspace, y la ubicación del archivo almacenado en su servidor, debe modificar su flujo de trabajo. Tiene que ser: archivos subidos

  1. Formulario para -Su en servidor
  2. -su en servidor calcula el envase y el nombre de archivo que el archivo utilizará
  3. -su en servidor carga el archivo temporal a Rackspace archivos

Si desea que el archivo sea públicamente descargable ...

  1. -su en servidor permite el archivo para ser servido a través de la CDN, Makin g una URL pública para el archivo al que su usuario puede acceder.
  2. cuando el servidor crea html que incrusta las direcciones URL de CDN y el usuario recibe mágicamente los archivos

Si desea que el archivo sea única descargable por -certain- usuarios ....

  1. -su en servidor autentica con Rackspace y descarga el archivo temporal
  2. -su en servidor sirve el archivo y el código HTML tanto desde su servidor

Haces no pague por el ancho de banda entre -su servidor- y los archivos de rackspace, si -su servidor- también es una instancia de nube de rack o un servidor regular de Rackspace administrado (o al menos eso es lo que el servicio de atención al cliente me ha dicho). Un hecho importante al calcular las tasas entre Amazon y Rackspace.

Para que pueda usar Rackspace Files como un disco duro masivo para su servidor, que le da control sobre el acceso, o puede usarlo como una red de distribución pública masiva ... Pero en ambos casos es posible que necesite para cambiar el orden de los pasos para darle lo que desea ...

También puede consultar a simple example of using php to upload a file gathered from an HTML form to rackspace files.

+0

¡Gran respuesta, gracias! Tendrá que verificar ese simple ejemplo en otro lugar (cuenta suspendida). Tal vez esté en la máquina Wayback. En mi caso, tengo una aplicación iOS que preferiría publicar archivos directamente en Rackspace Files. ¡Por supuesto que no podemos tener la clave de acceso en la aplicación! Recuerdo que Facebook solía tener un mecanismo mediante el cual se podía generar un token en un servidor (a través de una solicitud de SSL) y luego ser utilizado por la aplicación por un tiempo limitado. Nunca fue guardado a la vista (solo para el llavero seguro). Tal vez hay una manera de hacer eso para los archivos Rackspace? Ni siquiera salvaría la ficha. Solo úsalo según sea necesario. –

+1

PUEDE subir un archivo directamente a los archivos en la nube ahora. Usted crea un token/firma para la solicitud y puede usar un formulario para enviarlo directamente. Consulte http://docs.rackspace.com/files/api/v1/cf-devguide/content/Create_the_Form-d1a777.html – DesignerGuy

1

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

de welcome_message.php:

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

problemas que encontré:

cacert.pem ~ Este archivo tiene que ir en su directorio web y viene con la API.

puede necesitar fileinfo de pecl, y para esto puede necesitar libmagic (si no lo tiene ya).

también necesita el paquete php5-curl, y php no informa errores de curl, así que profundice en la API y agregue alguna salida si no está funcionando.

1

Muchas de estas respuestas son viejos y mirando a Orbit's answer Creo que debe haber habido muchos cambios en la API desde entonces. Y desde ftrotter already explained para tratar de cargar directamente, le mostraré una versión actualizada (estilo PHP 5.3) de cómo enviar los archivos desde el directorio PHP tmp.

Primero asumiremos que ya instaló la API usando el compositor.

Primero tendrá que incluir su autocargador y luego agregar el espacio de nombre use.

require 'vendor/autoload.php'; 

use OpenCloud\Rackspace as Rackspace; 

Entonces sólo tiene que configurar la instancia de cliente

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

Ahora que tiene su contenedor puede simplemente configurar su array de archivos y subirlos. Aquí está una manera rápida y sucia:

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

Ahora sus archivos mantendrán sus nombres existentes cuando terminan en el contenedor, y se puede obtener la ruta URL pública para su contenedor directamente desde el portal de Rackspace Cloud.

+0

No funciona y dice "Falta el argumento 2 para OpenCloud \ ObjectStore \ Resource \ Container :: uploadObject (), " –

+0

@ kamlesh.bar Debería ser' uploadObjects() '(plural). Mi ejemplo usa 'uploadObjects()' Avíseme si eso ayuda –

Cuestiones relacionadas