簡體   English   中英

Rackspace雲文件:使用PHP將圖像上傳到Rackspace雲文件

[英]Rackspace cloud files: Image Upload to rackspace cloud files using PHP

我正在做一個項目,用戶可以在其中上傳個人資料圖像或圖像庫圖像。 現在,它將所有圖像上傳到我的服務器。

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

  1. 用戶選擇一個文件
  2. 按提交一些信息
  3. 所選文件將被上載到機架服務器並返回文件位置。
  4. 那么文件位置以及其他信息將保存在我的數據庫中。
  5. 然后我將顯示該位置的文件或圖像。

那么你有什么想法,確切地說我該怎么做?

我在用:

  • Codeigniter框架
  • jQuery作為javascript庫

預先感謝您的任何回答。

更新:盡管我下面描述的方法仍然可以使用,但是無法直接使用令牌上傳文件(感謝DesignerGuy提供該信息)。 您可以在此處閱讀有關如何執行操作的更多信息。 我還應該提到,像transloadit這樣的服務現在可以通過將jquery插入HTML表單來使這種事情變得簡單。 我下面描述的方法仍然可行,並且可能會為您提供最大的控制權。

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

  1. 表單將文件上傳到-您的服務器-
  2. -您的服務器-計算了文件將使用的容器和文件名
  3. -您的服務器-將臨時文件上傳到機架文件

如果您希望文件可公開下載...

  1. -您的服務器-允許通過CDN提供文件,並為用戶可以訪問的文件創建一個公共URL。
  2. 當您的服務器創建html時,它會嵌入CDN網址,並且用戶會神奇地獲取文件

如果您只希望-certain-用戶下載該文件...。

  1. -您的服務器-使用機架空間進行身份驗證並臨時下載文件
  2. -您的服務器-從您的服務器提供文件和HTML

如果您的服務器還是機架空間雲實例或常規的Rackspace受管服務器(或者至少是客戶支持告訴我的),則無需為服務器和機架空間文件之間的帶寬付費。 計算Amazon和Rackspace之間的費率時的重要事實。

因此,您既可以將Rackspace文件用作服務器的大型硬盤驅動器,從而控制訪問,也可以將其用作大型的公共分發網絡...但是在兩種情況下,您可能都需要更改以下順序:為您提供所需的步驟...

您可能還會看到一個簡單的示例,該示例使用php將從HTML表單收集的文件上傳到機架文件

這些答案很多都是陳舊的,從Orbit的答案來看,我認為此后必須對API進行很多更改。 並且由於ftrotter已經解釋了有關嘗試直接上傳的信息,因此我將向您展示如何從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 Cloud門戶中獲取容器的公共URL路徑。

來自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並添加一些輸出(如果它不起作用)。

我剛剛完成類似的工作。 我以為我會將發現添加到這篇文章中。

首先,將cloudfiles軟件包放置在application / libraries目錄中: https : //github.com/rackspace/php-cloudfiles

然后檢查這個簡單的集成類。 另外,放置在庫目錄中。 https://bitbucket.org/modomg/codeigniter-rackspace-cloudfiles

干杯,傑夫·沃爾特斯

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM