Rackspace云文件:Image使用PHP上传到rackspace云文件

时间:2010-02-06 20:06:09

标签: php image upload cdn rackspace

我正在做一个项目,用户可以上传图像,例如个人资料图像或图像,用于图像计算。现在它将所有图像上传到我的服务器。

现在,我想直接使用php脚本将所有这些图像上传到我的rackspace云文件。 例如:

  1. 用户选择文件
  2. 按提交提供一些信息
  3. 所选文件将上传到rackspace服务器并返回文件位置。
  4. 然后文件位置以及其他信息将保存在我的数据库中。
  5. 然后我将显示该位置的文件或图像。
  6. 所以你有任何想法,我究竟该如何做到这一点?

    我正在使用:

    • Codeigniter框架
    • jQuery as javascript library

    提前感谢任何答案。

4 个答案:

答案 0 :(得分:19)

更新:虽然我在下面描述的方法仍然可以使用,但是无法使用令牌直接上传文件(感谢DesignerGuy获取该信息)。您可以阅读有关如何执行此操作的更多信息here。我还应该提到像transloadit这样的服务现在使用jquery插入到HTML表单中使这种事情变得非常简单。我在下面描述的方法仍然有用,可能会给你最大的控制权。

您无法直接将文件加载到Rackspace文件,而无需尝试将Rackspace凭据嵌入到表单中。即使这是可能的,也不是一个好主意。 (即,用户可以使用与您的应用程序无关的凭据添加大量内容)。因此,要获得您想要的内容(主要是将文件存储在Rackspace中)以及存储在服务器中的文件位置,您需要修改工作流程。它必须是:

  1. 表格将文件上传到 - 您的服务器 -
  2. - 您的服务器 - 计算文件将使用的容器和文件名
  3. - 您的服务器 - 将临时文件上传到rackspace文件
  4. 如果您希望文件可以公开下载......

    1. - 您的服务器 - 允许通过CDN提供文件,为您的用户可以访问的文件创建公共URL。
    2. 当您的服务器创建html时,它会嵌入CDN网址并且用户会神奇地获取文件
    3. 如果您希望文件只能由-srtain- users下载....

      1. - 您的服务器 - 使用rackspace进行身份验证并暂时下载文件
      2. - 您的服务器 - 从您的服务器提供文件和HTML
      3. 如果 - 您的服务器 - 也是机架空间云实例或常规Rackspace托管服务器(或者至少是客户支持告诉我的那个),您不需要为您的服务器和机架空间文件之间的带宽付费。计算Amazon和Rackspace之间的比率时的一个重要事实。

        因此,您可以将Rackspace文件用作服务器的大型硬盘驱动器,这可以让您控制访问,或者您可以将其用作大型公共分发网络...... 但在这两种情况下,您可能需要更改步骤的顺序,以便为您提供所需的内容......

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

答案 1 :(得分: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~这个文件需要放在你的网页目录中并附带api。

你可能需要来自pecl的fileinfo,为此你可能需要libmagic(如果你还没有)。

你还需要包php5-curl,php不报告卷曲错误,所以深入了解api并添加一些输出,如果它不起作用。

答案 2 :(得分: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 Cloud门户获取容器的公共URL路径。

答案 3 :(得分:0)

我刚刚完成了类似的事情。我以为我会把我的发现添加到这篇文章中。

首先,将cloudfiles包放在application / libraries目录中: https://github.com/rackspace/php-cloudfiles

然后看看这个简单的集成类。另外,放在库目录中。 https://bitbucket.org/modomg/codeigniter-rackspace-cloudfiles

干杯, 杰夫沃尔特斯