【问题标题】:Rackspace cloud files: Image Upload to rackspace cloud files using PHPRackspace 云文件:使用 PHP 将图像上传到 rackspace 云文件
【发布时间】:2011-01-13 22:42:42
【问题描述】:

我正在做一个项目,用户可以为他们的图片库上传个人资料图片或图片等图片。现在它将所有图像上传到我的服务器。

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

  1. 用户选择一个文件
  2. 按提交并提供一些信息
  3. 所选文件将上传到机架空间服务器并返回文件位置。
  4. 然后文件位置和其他信息将保存在我的数据库中。
  5. 然后我将显示该位置的文件或图像。

所以你有什么想法,我到底该怎么做?

我正在使用:

  • Codeigniter 框架
  • jQuery 作为 javascript 库

提前感谢您的任何回答。

【问题讨论】:

    标签: php image upload cdn rackspace


    【解决方案1】:

    更新:尽管我在下面描述的方法仍然有效,但无法使用令牌直接上传文件(感谢DesignerGuy 提供该信息)。你可以阅读更多关于如何做到这一点here。我还应该提到像transloadit 这样的服务现在使用jquery 插入HTML 表单使这种事情变得非常容易。我在下面描述的方法仍然有效,并且可能给您最大的控制权。

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

    1. 表单将文件上传到-您的服务器-
    2. -您的服务器-计算文件将使用的容器和文件名
    3. -您的服务器-将临时文件上传到 rackspace 文件

    如果您希望文件可公开下载...

    1. -您的服务器- 允许通过 CDN 提供文件,为您的用户可以访问的文件创建一个公共 URL。
    2. 当您的服务器创建 html 时,它会嵌入 CDN url,用户会神奇地获取文件

    如果您希望文件只能由 -certain- 用户下载....

    1. -您的服务器- 使用 rackspace 进行身份验证并临时下载文件
    2. -您的服务器- 从您的服务器提供文件和 HTML

    如果 -your server- 也是 rackspace 云实例或常规 Rackspace 托管服务器(或者至少这是客户支持告诉我的),您无需为 -your server- 和 rackspace 文件之间的带宽付费。计算 Amazon 和 Rackspace 之间的费率时的一个重要事实。

    因此,您既可以将 Rackspace Files 用作服务器的大型硬盘驱动器,让您控制访问,也可以将其用作大型公共分发网络... 但在这两种情况下,您可能都需要更改步骤的顺序以提供您想要的...

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

    【讨论】:

    • 很好的答案 - 谢谢!将不得不在其他地方检查那个简单的例子(帐户被暂停)。也许它在 Wayback 机器上。就我而言,我有一个 iOS 应用程序,我希望将文件直接发布到 Rackspace 文件。当然,我们不能在应用程序中拥有访问密钥!我记得 Facebook 曾经有一种机制,通过该机制可以在服务器上生成令牌(通过 SSL 请求),然后由应用程序在有限的时间内使用。它从未公开保存(仅保存到安全钥匙串)。也许有一种方法可以为 Rackspace Files 做到这一点?我什至不会保存令牌。按需使用即可。
    • 您现在可以将文件直接上传到 cloudfiles。您为请求创建令牌/签名,并可以使用表单直接提交。见docs.rackspace.com/files/api/v1/cf-devguide/content/…
    【解决方案2】:

    来自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 的文件信息,为此您可能需要 libmagic(如果您还没有的话)。

    你还需要 php5-curl 这个包,而且 php 不会报 curl 错误,所以深入研究一下 api,如果它不起作用,添加一些输出。

    【讨论】:

      【解决方案3】:

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

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

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

      干杯, 杰夫·沃尔特斯

      【讨论】:

        【解决方案4】:

        很多这些答案都是旧的,看看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 路径。

        【讨论】:

        • 它不起作用并显示“缺少 OpenCloud\ObjectStore\Resource\Container::uploadObject() 的参数 2”,
        • @kamlesh.bar 应该是uploadObjects()(复数)。我的示例使用 uploadObjects() 如果有帮助,请告诉我
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多