SkyDrive dla programisty - Foldery i pliki - odczytywanie i uaktualnianie właściwości folderów
Tłumaczenie na podstawie Folders and Files: Norbert Blandzi
Opublikowano: 2012-06-28
Twoje aplikacje mogą wykorzystywać Live Connect APIs do tworzenia, czytania, uaktualniania i usuwania folderów i plików użytkowników Microsoft SkyDrive.
Uwaga! W tym kontekście, file oznacza plik każdego z obsługiwanych formatów ze zdjęciami i plikami audio lub wideo włącznie. Folder może zawierać podfoldery oraz pliki. Album jest specjalnym typem folderu (aby dowiedzieć się więcej, sprawdź Multimedia – Czytanie i usuwanie albumów). Listę obsługiwanych formatów plików znajdziesz w sekcji "Dostępne formaty plików" w odcinku Podstawowe pojęcia.
Twoje aplikacje mogą wykorzystywać API, aby otrzymać link do wysyłania plików. Wtedy możesz dzielić się tymi linkami z innymi użytkownikami, dzięki czemu, będą mieli bezpośredni dostęp do plików.
W celu pełnego wykorzystania przykładów kodu w tym temacie, możesz wykorzystać je w kontekście większego przykładu, który omówiliśmy w publikacji Working with the code examples. Aby podać odpowiedni kontekst, sprawdź wzorce kodów w Obtaining user consent.
Odczytywanie właściwości folderu
W celu uzyskania więcej informacji o folderze, użyj poniższego kodu. Wymagany jest kontekst wl.skydrive:
[REST]
GET
http://apis.live.net/v5.0/folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!114?access_token=ACCESS_TOKEN
[JavaScript]
JavaScript
function readFolderProperties_onClick() {
WL.login({
scope: "wl.skydrive"
}).then(
function (response) {
WL.api({
path: "folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!164",
method: "GET"
}).then(
function (response) {
document.getElementById("infoLabel").innerText =
"Folder properties: name = " + response.name + ", ID
" + response.id;
},
function (responseFailed) {
document.getElementById("infoLabel").innerText =
"Error reading folder properties: " +
ResponseFailed.error.message;
}
);
},
function (responseFailed) {
document.getElementById("infoLabel").innerText =
"Error signing in: " + responseFailed.error_description;
}
);
}
[Aplikacja Metro - C#]
private async void btnReadFolder_Click(object sender, RoutedEventArgs e)
{
try
{
LiveConnectClient liveClient = new LiveConnectClient(this.session);
LiveOperationResult operationResult =
await
LiveClient.Get("folder.8c8ce076ca27823f.8C8CE076CA27823F!126");
dynamic result = operationResult.Result;
infoTextBlock.Text = "Folder name: " + result.name + ", ID: " +
Result.id;
}
catch (LiveConnectException exception)
{
infoTextBlock.Text = "Error getting folder info: " +
Exception.Message;
}
}
[Aplikacja Windows Phone- C#]
private void btnGetFolderProperties_Begin(object sender, RoutedEventArgs e)
{
if (session == null)
{
infoTextBlock.Text = "You must sign in first.";
}
else
{
LiveConnectClient client = new LiveConnectClient(session);
client.GetCompleted +=
new
EventHandler<LiveOperationCompletedEventArgs>(getFolderProperties_Completed);
client.GetAsync("folder.8c8ce076ca27823f.8C8CE076CA27823F!158");
}
}
void getFolderProperties_Completed(object sender,
iveOperationCompletedEventArgs e)
{
if (e.Error == null)
{
IDictionary<string, object> folder = e.Result;
infoTextBlock.Text = "Folder name: " + folder["name"].ToString() +
"\nID: " + folder["id"].ToString();
}
else
{
infoTextBlock.Text = "Error calling API: " + e.Error.Message;
}
}
[Objective-C]
- (void) getFolderInfo
{
NSString *folderId = @"folder.2e82e8a5445fe036";
[self.liveClient getWithPath:folderId
delegate:self
userState:@"get folder"];
}
- (void) liveOperationSucceeded:(LiveOperation *)operation
{
if ([operation.userState isEqual:@"get folder"]) {
self.folderIdLabel.text = [operation.result objectForKey:@"id"];
self.folderNameLabel.text = [operation.result objectForKey:@"name"];
self.folderUploadPathLabel.text = [operation.result
ObjectForKey:@"upload_location"];
self.folderLinkLabel.text = [operation.result objectForKey:@"link"];
self.folderTypeLabel.text = [operation.result objectForKey:@"type"];
};
}
- (void) liveOperationFailed:(NSError *)error
operation:(LiveOperation *)operation
{
if ([operation.userState isEqual:@"get folder"]) {
self.statusLabel.text = @"The request to read the SkyDrive folder
Information failed.";
};
}
[Java]
public void readFolder() {
client.getAsync("folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!125", new
LiveOperationListener() {
public void onComplete(LiveOperation operation) {
JSONObject result = operation.getResult();
try {
resultTextView.setText("Folder ID = " +
Result.getString("id") +
", name = " + result.getString("name"));
} catch (JSONException e) {
resultTextView.setText("Error reading folder: " +
.getMessage());
return;
}
}
public void onError(LiveOperationException exception, LiveOperation
Operation) {
resultTextView.setText("Error reading folder: " +
Exception.getMessage());
}
});
}
W powyższym kodzie zmień ID folderu na:
- ID innego folderu, aby otrzymać informacje o innych folderach,
- · FOLDER_ID
/files
, gdzie FOLDER_ID reprezentuje odpowiednie ID folderu, aby zdobyć listę wszystkich pozycji znajdujących się w folderze. Twój kod może sprawdzić, czy któraś z tych pozycji ma strukturę type, ustawioną na folder. Następnie, Twój kod może wykonać kolejne wywołanie, które wykorzysta ID elementów składowych folderu, aby uzyskać informacje o tym podfolderze.
Możesz także:
- pobrać informacje o głównych folderach użytkowników w katalogu SkyDrive. Aby to zrobić zastąp ID folderu przez wprowadzenie me/skydrive (lub USER_ID/skydrive),
- pobrać informacje o pewnych folderach przez użycie predefiniowanych nazw. Aby to zrobić, użyj me/skydrive/FRIENDLY_FOLDER_NAME lub USER_ID/skydrive/FRIENDLY_FOLDER_NAME*,* gdzie me reprezentuje aktualnego użytkownika, USER_ID reprezentuje ID użytkownika, który wyraził na to zgodę, a FRIENDLY_FOLDER_NAME reprezentuje uwzględnioną predefiniowaną nazwę folderu, taką jak
my_documents
(która reprezentuje folder Dokumenty). Aby zdobyć więcej informacji, sprawdź temat Podstawowe pojęcia w sekcji "Użyj predefiniowanych nazw, aby umożliwić dostęp do niektórych folderów SkyDrive", - pobrać informacje o pewnych typach elementów, wykorzystując filtr parametrów w powyższym kodzie i określając typ elementów: all (domyślny), photos, videos, audio, folders lub albums. Na przykład, aby otrzymać informacje tylko o zdjęciach, użyj FOLDER_ID/files?filter=photos,
- uzyskać ograniczoną liczbę elementów przez użycie parametru limit, określającego liczbę elementów, które chcesz uzyskać. Na przykład, aby zdobyć pierwsze dwa elementy, użyj FOLDER_ID/files?limit=2,
- określić pierwszy element, który chcesz pobrać przez użycie parametruoffset w powyższym kodzie jako wskaźnika pierwszego elementu, który chcemy zdobyć. Na przykład, aby pobrać dwa elementy, począwszy od trzeciego elementu, użyj FOLDER_ID/files?limit=2&offset=3.
Uwaga! W odpowiedzi otrzymamy sformatowany obiekt JavaScript Object Notation (JSON). Możesz tu wyszukać obiekt typu paging, a w nim struktury next i previous, w celu uzyskania informacji o poprzednich i następnych elementach, jeśli istnieją:
- ustawić kryteria sortowania przez użycie parametru sort_by w poprzedzającym kodzie przez określenie następujących kryteriów: created, updated, name, size lub default. Na przykład, aby sortować elementy według nazwy użyj FOLDER_ID/files?sort_by=name,
- ustawić porządek sortowania, używając parametru sort_order w powyższym kodzie przez określenie porządku: rosnący lub malejący. Na przykład, aby ustawić malejący porządek sortowania, używając FOLDER_ID/files?sort_order=descending.
Uaktualnianie właściwości folderów
Aby zmienić informację o istniejącym folderze, użyj poniższego kodu. Wymagany jest kontekst wl.skydrive_update:
[REST]
PUT https://apis.live.net/v5.0/folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!114
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
name: "My example folder has changed"
}
[JavaScript]
JavaScript
function updateFolderProperties_onClick() {
WL.login({
scope: "wl.skydrive_update"
}).then(
function (response) {
WL.api({
path: "folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!164",
method: "PUT",
body: {
name: "A different folder name"
}
}).then(
function (response) {
document.getElementById("infoLabel").innerText =
"Updated folder. Name: " + response.name + ", ID: " + response.id;
},
function (responseFailed) {
document.getElementById("infoArea").innerText =
"Error calling API: " + responseFailed.error.message;
}
);
},
function (responseFailed) {
document.getElementById("infoArea").innerText =
"Error signing in: " + responseFailed.error_description;
}
);
}
[Aplikacja Metro – C#]
C#
private async void btnUpdateFolder_Click(object sender, RoutedEventArgs e)
{
try
{
var folderData = new Dictionary<string, object>();
folderData.Add("name", "This folder is renamed");
LiveConnectClient liveClient = new LiveConnectClient(this.session);
LiveOperationResult operationResult =
await liveClient.Post("folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!145", folderData);
dynamic result = operationResult.Result;
this.infoTextBlock.Text = "Folder updated: " + result.name;
}
catch (LiveConnectException exception)
{
this.infoTextBlock.Text = "Error updating folder: " + exception.Message;
}
}
[Aplikacja Windows Phone – C#]
C#
private void btnRenameFolder_Begin(object sender, RoutedEventArgs e)
{
if (session == null)
{
infoTextBlock.Text = "You must sign in first.";
}
else
{
Dictionary<string, object> folderData = new Dictionary<string, object>();
folderData.Add("name", "This folder is renamed");
LiveConnectClient client = new LiveConnectClient(session);
client.PutCompleted +=
new EventHandler<LiveOperationCompletedEventArgs>(RenameFolder_Completed);
client.PutAsync("folder.8c8ce076ca27823f.8C8CE076CA27823F!158", folderData);
}
}
void RenameFolder_Completed(object sender, LiveOperationCompletedEventArgs e)
{
if (e.Error == null)
{
infoTextBlock.Text = "Folder renamed.";
}
else
{
infoTextBlock.Text = "Error calling API: " + e.Error.ToString();
}
}
[Objective-C]
-(void) updateFolder
{
NSDictionary * updatedFolder = [[NSDictionary dictionaryWithObjectsAndKeys:
@"Family vacation in the snow",@"description",
nil] retain];
[self.liveClient putWithPath:@"folder.95d463b9efcca0e1.95D463B9EFCCA0E1!112"
dictBody:updatedFolder
delegate:self];
[updatedFolder release];
}
- (void) liveOperationSucceeded:(LiveOperation *)operation
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"API call successful!"
message:@"Album updated successfully"
delegate:self
cancelButtonTitle:@"Ok"
otherButtonTitles:nil,
nil];
[alert show];
[alert release];
}
[Java]
public void updateFolder() {
final String folderId = "folder.a6b2a7e8f2515e5e.A6B2A7E8F2515E5E!125";
final LiveOperationListener opListener = new LiveOperationListener() {
public void onError(LiveOperationException exception, LiveOperation operation) {
resultTextView.setText("Error updating folder: " + exception.getMessage());
}
public void onComplete(LiveOperation operation) {
JSONObject result = operation.getResult();
String text = "Folder updated:\n" +
"\nID = " + result.optString("id") +
"\nName = " + result.optString("name");
resultTextView.setText(text);
}
};
auth.login(this, Arrays.asList(new String[] { "wl.skydrive_update" }),
new LiveAuthListener() {
public void onAuthError(LiveAuthException exception, Object userState) {
resultTextView.setText("Error signing in: " + exception.getMessage());
}
public void onAuthComplete(LiveStatus status, LiveConnectSession session, Object userState) {
try {
JSONObject body = new JSONObject();
body.put("name", "MyFolderIsUpdated");
body.put("description", "My folder is updated");
client.putAsync(folderId, body, opListener);
}
catch(JSONException ex) {
resultTextView.setText("Error updating folder: " + ex.getMessage());
}
}
}
);
}
W powyższym kodzie ustaw wartość zmiennej folderID na ID folderu lub w pewnych przypadkach na przyjazną nazwę folderu, który chcesz zmienić.
Aby dowiedzieć się więcej o minimalnych wymaganiach i wybranych strukturach, które musi posiadać Twoja aplikacja w celu użycia metody PUT, sprawdź sekcję "Folder object" w dziale REST reference.
Podsumowanie
W tym odcinku nauczyliśmy się odczytywać i uaktualniać właściwości folderu w wielu językach programowania na różne platformy sprzętowe i programowe.