5 votes

Comment créer un nouveau fichier avec du contenu en utilisant Ubuntu One API et PHP

J'ai des problèmes lorsque j'essaie de créer un nouveau fichier avec du contenu (ou d'écraser le contenu d'un fichier existant) en utilisant la fonction Ubuntu One API et PHP.

Je peux facilement créer un fichier ou un dossier vide en utilisant :

PUT /api/file_storage/v1/~/path/to/volume/path/to/node

mais je ne comprends pas comment utiliser cette spécification :

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.)

Je ne poste pas le code entier mais seulement la ligne qui ne fonctionne pas :

$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);

Je ne comprends pas comment structurer la syntaxe. Pouvez-vous m'aider ?

4voto

titanae Points 1481

Le problème que vous rencontrez est que pour placer un fichier avec du contenu, vous devez obtenir le "content_path" du répertoire dans lequel vous voulez enregistrer le fichier, puis placer le nouveau fichier sous ce content_path. Voyez l'exemple de code ci-dessous, qui crée un répertoire ~/Ubuntu One/phptestfolder obtient son chemin d'accès au contenu, puis place un fichier foo.txt dans ce nouveau dossier.

<?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);

?>

2voto

Matteo Pagliazzi Points 2693

J'ai enfin trouvé la solution !

Il y avait deux problèmes :

  1. Maintenant, l'url pour le contenu des fichiers n'est pas l'url de l'api, mais l'url de l'API. https://files.one.ubuntu.com

  2. avant le chemin du fichier, vous devez placer "contenu/chemin du fichier".

Quelque chose comme ça

oauth->fetch('https://files.one.ubuntu.com/content/~/Ubuntu%20One/prova.php') ;

1voto

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

Je pense qu'il y a quelques erreurs :

  • OAUTH_HTTP_METHOD_PUT est le troisième argument et non le deuxième pour oauth->fetch()
  • /Ubuntu One.' peut-être qu'au lieu de . vous vouliez un / ?
  • le contenu du fichier, je pense que cela devrait être le deuxième argument

donc, IMHO, la ligne corrigée est :

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

(peut-être que vous voulez corrent même $filecontentent a $filecontent )

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X