2010-02-06 6 views
11

Ich mache ein Projekt, wo Benutzer Bilder wie Profilbild oder Bild für ihre Bildergalerie hochladen können. Jetzt lade ich alle Bilder auf meinen Server hoch.Rackspace-Cloud-Dateien: Image Upload in Rackspace-Cloud-Dateien mit PHP

Jetzt möchte ich dieses Bild in meine Rackspace Cloud-Dateien direkt mit PHP-Skript hochladen. Zum Beispiel:

  1. Benutzer wählen Sie eine Datei
  2. Presse mit einigen Datei auf den Server und Höheneinheit zurückzukehren den Speicherort der Datei hochgeladen werden
  3. die ausgewählten Informationen vorzulegen.
  4. dann wird der Speicherort der Datei zusammen mit anderen Informationen in meiner Datenbank gespeichert.
  5. dann werde ich die Datei oder das Bild von diesem Ort zeigen.

also hast du eine idee, genau wie ich das machen kann?

ich bin mit:

  • Codeigniter Rahmen
  • jQuery als JavaScript-Bibliothek

Dank im Voraus für jede Antwort.

Antwort

19

Update: Obwohl die Methode, die ich im Folgenden beschreibe, immer noch funktioniert, ist es nicht möglich, Dateien direkt mit Token hochzuladen (dank DesignerGuy für diese Info). Sie können mehr darüber lesen, wie Sie das tun here. Ich sollte auch erwähnen, dass Dienste wie transloadit jetzt diese Art von Sache trivial einfach machen, indem sie jquery-Einfügungen in HTML-Formulare verwenden. Dennoch funktioniert die Methode, die ich unten beschreibe, immer noch und gibt dir wahrscheinlich die meiste Kontrolle.

Sie können Dateien - direkt - nicht in Rackspace-Dateien laden, ohne etwas wie das Einbetten der Rackspace-Anmeldedaten in das Formular zu versuchen. Selbst wenn das möglich wäre, wäre das keine gute Idee. (d. h. der Benutzer könnte mit Ihren Anmeldeinformationen, die nichts mit Ihrer Anwendung zu tun haben, massiven Inhalt hinzufügen). Um zu erreichen, was Sie wollen, was im Wesentlichen die Speicherung der Datei in Rackspace und den Speicherort der Datei auf Ihrem Server bedeutet, müssen Sie Ihren Arbeitsablauf ändern. Es muss sein:

  1. Formular Uploads Datei server-
  2. -Ihr server- -Ihr den Container und den Dateinamen berechnet, dass die Datei
  3. -Ihr server- lädt die temporäre Datei Dateien verwenden, um Rackspace

Wenn Sie die Datei wollen öffentlich zum Download sein ...

  1. -Ihr server- ermöglicht die Datei über das CDN bedient werden, Makin g eine öffentliche URL für die Datei, auf die der Benutzer zugreifen kann.
  2. , wenn der Server es bettet die Urls CDN erzeugt HTML und der Benutzer erhält auf magische Weise die Dateien

Wenn Sie die Datei wollen von -certain- Benutzer nur herunterladbare sein ....

  1. -Ihr server- authentisiert mit Rackspace und lädt die Datei vorübergehend
  2. -Ihr server- die Datei und die HTML dient sowohl von Ihrem Server

Sie tun nicht für Bandbreite zwischen - Server- und Rackspace-Dateien bezahlen, wenn - Ihr Server - auch eine Rackspace-Cloud-Instanz oder ein regelmäßiger Rackspace Managed Server ist (oder zumindest hat mir der Kundendienst gesagt). Eine wichtige Tatsache bei der Berechnung der Raten zwischen Amazon und Rackspace.

So können Sie Rackspace-Dateien entweder als massive Festplatte für Ihren Server verwenden, die Ihnen die Kontrolle über den Zugriff gibt, oder Sie können es als massive öffentliche Vertriebsnetz verwenden ... Aber in beiden Fällen benötigen Sie möglicherweise um die Reihenfolge Ihrer Schritte zu ändern, um Ihnen zu geben, was Sie wollen ...

Sie können sich auch a simple example of using php to upload a file gathered from an HTML form to rackspace files ansehen.

+0

Große Antwort - danke! Muss an einem anderen Ort nach diesem einfachen Beispiel suchen (Konto gesperrt). Vielleicht ist es auf der Wayback Machine. In meinem Fall habe ich eine iOS-App, die Postdateien direkt in Rackspace-Dateien bevorzugen würde. Natürlich können wir den Zugangsschlüssel nicht in der App haben! Ich erinnere mich, Facebook hatte früher einen Mechanismus, mit dem ein Token auf einem Server generiert werden konnte (via SSL-Anfrage) und dann von der App für eine begrenzte Zeit genutzt wurde. Es wurde niemals im Freien gespeichert (nur für den sicheren Schlüsselbund). Vielleicht gibt es eine Möglichkeit, dies für Rackspace-Dateien zu tun? Ich würde das Token nicht einmal speichern. Benutze es einfach nach Bedarf. –

+1

Sie können jetzt eine Datei direkt in cloudfiles hochladen. Sie erstellen ein Token/eine Signatur für die Anforderung und können ein Formular verwenden, um direkt zu senden. Siehe http://docs.rackspace.com/files/api/v1/cf-devguide/content/Create_the_Form-d1a777.html – DesignerGuy

1

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

von welcome_message.php:

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

Probleme, die ich gestoßen:

cacert.pem ~ Diese Datei in Ihrem Web-Verzeichnis gehen muss und kommt mit der api.

Sie benötigen möglicherweise Fileinfo von pecl, und dafür benötigen Sie libmagic (wenn Sie es nicht bereits haben).

Sie brauchen auch das Paket php5-curl, und php meldet keine curl-Fehler, also graben Sie in die API und fügen Sie einige Ausgaben hinzu, wenn es nicht funktioniert.

1

Viele dieser Antworten sind alt und Blick auf Orbit's answer ich glaube, es seitdem viele Änderungen an der API gewesen sein muss. Und seit ftrotter already explained über den Versuch, direkt zu laden, werde ich Ihnen eine aktualisierte Version (PHP 5.3 Stil) zeigen, wie Sie die Dateien aus dem PHP tmp-Verzeichnis senden.

Zuerst nehmen wir an, dass Sie bereits die API mit Composer installiert haben.

Zuerst müssen Sie ihren Autoloader hinzufügen und dann den Namespace use hinzufügen.

require 'vendor/autoload.php'; 

use OpenCloud\Rackspace as Rackspace; 

Dann Sie einfach Setup der Client-Instanz

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

Nachdem Sie nun Ihren Behälter haben können Sie einfach Ihre Setup-Array von Dateien und sie laden. Hier ist eine schnelle und schmutzige Art und Weise:

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

Jetzt können Sie Ihre Dateien werden ihre bestehenden Namen behalten, wenn sie in den Behälter am Ende, und Sie können den öffentlichen URL-Pfad für Ihren Container direkt aus dem Rackspace Cloud Portal erhalten.

+0

Es funktioniert nicht und sagt: „Fehlende Argument 2 für Opencloud \ Objects \ Resource \ Container :: uploadObject (), " –

+0

@ kamlesh.bar" Es sollte 'uploadObjects()' (Plural) sein. Mein Beispiel verwendet 'uploadObjects()' Lassen Sie mich wissen, wenn das hilft –