2010-02-06 140 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

    相关问题