Como criar um novo arquivo com conteúdo usando o Ubuntu One API e PHP

5

Estou tendo alguns problemas quando tento criar um novo arquivo com algum conteúdo (ou sobrescrever o conteúdo de um existente) usando API do Ubuntu One e PHP.

Eu posso criar e esvaziar facilmente arquivos ou pastas usando:

PUT / api / file_storage / v1 / ~ / caminho / para / volume / caminho / para / nó

mas não entendi como usar esta especificação:

PUT /api/file_storage/v1/ + <directory.content_path> + '/' + filename.ext, or /api/file_storage/v1/ + <file.content_path>

PUT a new file, with content, in one action, or overwrite content of an existing file.
The body of the PUT request is the content of the file.
Note that you cannot PUT a new file with content and alter its attributes at the same time.
Note also that content_paths may not be rooted under the API root, and may change without warning, so they must be read from the API and not hardcoded.
(Note caveat above about CONTENT_ROOT being temporarily different.)

Eu não publico todo o código, mas apenas a linha que não funciona:

$api_url = 'https://one.ubuntu.com/api/file_storage/v1/';
$filecontentent = "content of the txt file";

$oauth->fetch($api_url.'~/Ubuntu One.'.$filecontentent.'/try.txt', OAUTH_HTTP_METHOD_PUT);

Eu não entendo como estruturar a sintaxe. Você pode me ajudar?

    
por Matteo Pagliazzi 29.07.2011 / 21:06

3 respostas

2

Finalmente, encontrei a solução!

Houve dois problemas:

  1. Agora, como agora, a URL do conteúdo dos arquivos não é a URL da API, mas o link

  2. antes do caminho do arquivo, você deve colocar "conteúdo / caminho do arquivo"

Algo parecido com isto

% bl0ck_qu0te%     
por Matteo Pagliazzi 02.08.2011 / 10:41
4

O problema que você está tendo é que, para colocar um arquivo com conteúdo, você precisa obter o "content_path" do diretório em que deseja salvar o arquivo e, em seguida, colocar o novo arquivo sob aquele content_path. Veja o código de exemplo abaixo, que cria uma pasta ~/Ubuntu One/phptestfolder , obtém seu content_path e, em seguida, coloca um arquivo foo.txt dentro dessa pasta recém-criada.

<?php
# Set up OAuth with the token details you've previously saved
$conskey = 'CCCCCC';
$conssec = 'SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS';
$token = 'TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT';
$secret = 'ssssssssssssssssssssssssssssssssssssssssssssssssss';

$oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$oauth->enableDebug();
$oauth->enableSSLChecks();
$oauth->setToken($token,$secret);

# Create a folder in Ubuntu One.
# Folders are created by PUTting to the folder path with a PUT body of
# {"kind": "directory"} as explained at 
# https://one.ubuntu.com/developer/files/store_files/cloud/#put_apifile_storagev1pathtovolumepathtonode

$api_url = 'https://one.ubuntu.com/api/file_storage/v1/';
$oauth->fetch($api_url.'~/Ubuntu%20One/php-test-folder', '{"kind": "directory"}', OAUTH_HTTP_METHOD_PUT);
$response = json_decode($oauth->getLastResponse());
print_r($response);

# So now, we want to upload a file to that new folder. To do that, you need
# to get the directory content path. As explained at
# https://one.ubuntu.com/developer/files/store_files/cloud/#get_apifile_storagev1pathtovolumepathtonode
# "Note that a directory has a content_path. This means that you can PUT a new 
# file with content into that directory (see below) by PUTting to 
# CONTENT_ROOT + <directory.content-path> + '/' + filename.ext.
# CONTENT_ROOT is the root of the files API itself, /api/file_storage/v1/, but 
# temporarily it should be set to https://files.one.ubuntu.com. 
# (This note will be removed when this is fixed.)"
# So, we need the directory content path. This is returned in the output from
# the above statement ($oauth->getLastResponse). So, to put a file foo.txt
# with content "this is foo", the URL we need is:
# CONTENT_ROOT: https://files.one.ubuntu.com               +
# directory_content_path: $response['content_path']        +
# /: /                                                     +
# filename: foo.txt

# We want to urlencode the path (so that the space in "Ubuntu One", for example,
# becomes %20), but not any slashes therein (so the slashes don't become %2F).
# urlencode() encodes spaces as + so we need rawurlencode
$encpath = rawurlencode($response->content_path);
$encpath = str_replace("%2F", "/", $encpath);

$put_file_url = "https://files.one.ubuntu.com" . $encpath . "/" . "foo.txt";
$oauth->fetch($put_file_url, "this is foo", OAUTH_HTTP_METHOD_PUT, array('Content-Type'=>'application/json'));
$response = json_decode($oauth->getLastResponse());
print_r($response);

?>
    
por sil 03.08.2011 / 10:00
1
$oauth->fetch($api_url.'~/Ubuntu One.'.$filecontentent.'/try.txt', OAUTH_HTTP_METHOD_PUT);

Acho que há alguns erros:

  • OAUTH_HTTP_METHOD_PUT é o terceiro argumento e não o segundo para oauth- > fetch ()
  • /Ubuntu One.' talvez em vez de. você queria um /?
  • o conteúdo do arquivo eu acho que deveria ser o segundo argumento

então, IMHO, a linha corrigida é:

$oauth->fetch($api_url.'~/Ubuntu One/try.txt', $filecontentent, OAUTH_HTTP_METHOD_PUT);

(talvez você queira corrigir até $filecontentent para $filecontent )

    
por fain182 29.07.2011 / 23:45