我有这个代码来从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服务器,然后将其上传到云端。
答案 0 :(得分:1)
是的,您可以模拟文件上传而无需将内容实际上传到API - 您需要做的就是确定文件名是什么。您需要的代码是:
$object = $container->getObject();
$object->setName('blah.txt');
$account = $service->getAccount();
$account->setTempUrlSecret();
echo $object->getTemporaryUrl(100, 'PUT');
getObject
方法返回一个空对象,您所做的只是在该对象上设置远程名称。创建临时URL时,它会使用您刚设置的名称并显示临时URL供您使用 - 无论该对象是否远程存在。然后可以使用临时URL来创建对象。