12

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

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

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

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

我在用:

  • Codeigniter 框架
  • jQuery 作为 javascript 库

提前感谢您的任何回答。

4

4 回答 4

19

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

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

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

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

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

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

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

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

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

您还可以查看一个使用 php 将收集自 HTML 表单的文件上传到 rackspace 文件的简单示例

于 2010-02-08T15:41:39.223 回答
2

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

于 2014-04-03T18:49:59.793 回答
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 的文件信息,为此您可能需要 libmagic(如果您还没有的话)。

您还需要包 php5-curl ,并且 php 不会报告 curl 错误,因此请深入研究 api 并在它不起作用时添加一些输出。

于 2010-08-04T02:16:08.790 回答
0

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

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

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

干杯,杰夫沃尔特斯

于 2011-06-26T16:26:59.620 回答