如何创建临时URL以使用PHP将文件上传到RackSpace云文件?

时间:2015-07-23 18:05:30

标签: php amazon-s3 rackspace-cloud

我有这个代码来从rackspace云文件中获取文件:

$username = getenv('RS_USERNAME');
$apikey = getenv('RS_APIKEY');
$containerName = 'imagenesfc';
$region = 'DFW';
$client = new Rackspace(Rackspace::US_IDENTITY_ENDPOINT, array(
    'username' => $username,
    'apiKey'   => $apikey,
));
$filename = "myfile.ext";

$service = $client->objectStoreService(null, $region);
$container = $service->getContainer($containerName);

$object = $container->getObject($filename);

$account = $service->getAccount();
$account->setTempUrlSecret();
$tempUrl = $object->getTemporaryUrl(15, 'GET');

open php cloud documentation中说你可以将'GET'改为'PUT'到我想象的能够放置文件,而不是得到它,问题是文件还不存在,并且显然创建文件的唯一方法是首先上传它? PHP SDK Container

在亚马逊s3中,我可以做以下事情来获得我想要的东西:

$keyname = "myfile.ext";

$arr = array(
    'Bucket' => 'bucket',
    'Key'    => $keyname
    );

$cmd = $s3Client->getCommand('PutObject', $arr);

$request = $s3Client->createPresignedRequest($cmd, '+10 minutes');
$presignedUrl = (string) $request->getUri();

然后我可以写一下我喜欢的presignedUrl,就像Java一样:

url = new URL(jObj.get("presignedUrl").toString().replace("\\", ""));
connection=(HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setRequestMethod("PUT");
out = new DataOutputStream(connection.getOutputStream());
...(write,flush,close)

因此,基本上我想做的是从RackSpace获取上传URL并像对待Amazon s3那样写入。

有可能吗?如果是的话,你怎么能这样做?

我需要这样做,因为我的API只提供下载和上传链接,因此没有流量直接通过它。我无法将文件保存到我的API服务器,然后将其上传到云端。

1 个答案:

答案 0 :(得分:1)

是的,您可以模拟文件上传而无需将内容实际上传到API - 您需要做的就是确定文件名是什么。您需要的代码是:

$object = $container->getObject();
$object->setName('blah.txt');

$account = $service->getAccount();
$account->setTempUrlSecret();

echo $object->getTemporaryUrl(100, 'PUT');

getObject方法返回一个空对象,您所做的只是在该对象上设置远程名称。创建临时URL时,它会使用您刚设置的名称并显示临时URL供您使用 - 无论该对象是否远程存在。然后可以使用临时URL来创建对象。