SkyDrive dla programisty - Foldery i pliki - odczytywanie i uaktualnianie właściwości folderów  Udostępnij na: Facebook

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.