2010-02-06 138 views
11

我正在做一個項目,用戶可以在其中上傳圖像配置文件圖像或圖像等圖像。現在它將所有圖像上傳到我的服務器。Rackspace雲文件:圖像使用PHP上傳到rackspace雲文件

現在,我想直接使用php腳本將所有這個圖像上傳到我的rackspace雲文件。 例如:

  1. 用戶選擇一個文件
  2. 按一些信息
  3. 選擇的文件將會被上傳到Rackspace公司服務器提交,並返回該文件的位置。
  4. 然後文件位置連同其他信息將被保存在我的數據庫中。
  5. 然後我會顯示該位置的文件或圖像。

所以你有什麼想法,究竟我該如何做到這一點?

我使用:

  • 笨框架
  • 的jQuery作爲JavaScript庫

先感謝您的任何答覆。

回答

19

更新:儘管我在下面描述的方法仍然可行,但不可能使用標記直接上傳文件(感謝該信息的DesignerGuy)。你可以閱讀更多關於如何做到這一點here。我還應該提到,像transloadit這樣的服務現在可以使用jQuery插入HTML表單來輕鬆實現這種事情。儘管如此,我下面描述的方法仍然有效,可能會給你最大的控制權。

無法將文件直接加載到Rackspace文件,而無需嘗試諸如將Rackspace憑據嵌入到表單中。即使這是可能的,這也不是一個好主意。 (即用戶可以使用與您的應用程序無關的憑證添加大量內容)。因此,要獲得您想要的內容(基本上是將文件存儲在Rackspace中)以及存儲在服務器中的文件位置,您需要修改您的工作流程。它需要:

  1. 形式上傳文件 - 你計算的容器和文件名服務器 -
  2. - 你的服務器 - 該文件將使用
  3. - 你的服務器 - 上傳臨時文件Rackspace公司文件

如果你想要的文件被公開下載...

  • - 你的服務器 - 允許文件通過CDN,馬金送達g用戶可以訪問的文件的公用URL。
  • 當你的服務器創建HTML時,它嵌入了CDN的URL,如果你想要的文件通過-certain-用戶只下載用戶神奇獲取文件
  • ....

  • - 你的服務器 - 以進行身份​​驗證和Rackspace公司下載文件暫時
  • - 你的服務器 - 提供文件,並從服務器的HTML都
  • 你做如果您的服務器也是機架空間雲實例或常規Rackspace託管服務器(或至少這是客戶支持告訴我的),則不支付您的服務器和機架空間文件之間的帶寬。計算亞馬遜和Rackspace之間的費率時一個重要的事實。

    因此,您可以使用Rackspace Files作爲服務器的大容量硬盤驅動器,它可以控制訪問,也可以將其用作大規模的公共分佈式網絡...... 但是在這兩種情況下,您可能都需要改變你的步驟順序,給你你想要的...

    你也可以看看a simple example of using php to upload a file gathered from an HTML form to rackspace files

    +0

    很好的答案 - 謝謝!必須檢查其他地方的這個簡單示例(帳戶被暫停)。也許它在Wayback機器上。在我的情況下,我有一個iOS應用程序,我寧願將文件直接發佈到Rackspace文件。當然,我們不能在應用程序中擁有訪問密鑰!我記得Facebook曾經有一種機制,通過它可以在服務器上生成令牌(通過SSL請求),然後在有限的時間內由應用使用。它從來沒有被公開保存過(僅限於安全鑰匙串)。也許有一種方法可以做到這一點Rackspace文件?我甚至不保存令牌。根據需要使用它。 – 2010-11-17 16:45:10

    +1

    您現在可以直接將文件上傳到雲文件。您爲請求創建令牌/簽名,並可以使用表單直接提交。請參閱http://docs.rackspace.com/files/api/v1/cf-devguide/content/Create_the_Form-d1a777.html – DesignerGuy 2014-04-27 21:34:42

    1

    從的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〜這個文件需要在你的web目錄中去隨api一起提供。

    你可能需要pecl的fileinfo,爲此你可能需要libmagic(如果你還沒有)。

    你還需要包php5-curl,並且php不報告curl錯誤,所以挖進api並添加一些輸出,如果它不工作。

    1

    很多這些答案都是老看着Orbit's answer我覺得從那以後一定有許多更改API。而且由於試圖直接上傳的ftrotter already explained,我將向您展示如何從PHP tmp目錄發送文件的更新版本(PHP 5.3樣式)。

    首先我們假設您已經使用composer安裝了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); 
        } 
    } 
    

    現在你的文件,當他們在容器中結束了,你可以從Rackspace的雲門戶網站中的權利得到您的集裝箱公共URL路徑將保持其現有名稱。

    +0

    它不起作用,並說「缺少OpenCloud的參數2 \ ObjectStore \ Resource \ Container :: uploadObject( ),「 – 2015-02-24 08:03:13

    +0

    @ kamlesh.bar它應該是'uploadObjects()'(複數)。我的例子使用'uploadObjects()'讓我知道這是否有幫助 – 2015-02-24 17:30:50

    相關問題