使ってみよう! Windows Live SDK/API

第17回 Windows Live Application Based Storage API(2)

この記事を読むのに必要な時間:およそ 14 分

ファイルのアップロード

ファイルのアップロードにはフォルダ作成時と同じPOSTメソッドを使用します。フォルダ作成時にはPOSTデータにXMLを指定しましたが,ファイルアップロードの場合はファイルのバイナリデータを指定します。またリクエストのContentTypeをアップロードするファイルのContentTypeにします。アップロードされたときのファイル名を指定するにはslugヘッダを使用します。

ファイルをアップロードするメソッドは以下のように記述します。引数にアップロード先のフォルダを示すパス,ファイル名,バイナリデータとそのContentTypeの文字列を渡すようにしています。

Protected Function UploadFile(ByVal path As String, ByVal fileName As String, ByVal data() As Byte, ByVal contentType As String) As XmlDocument
    Dim document As New XmlDocument
    Dim request As HttpWebRequest = CreatedNewRequest(path, "POST")

    ' ファイル名を指定
    request.Headers.Add("slug", fileName)

    ' ContentTypeを指定(image/pjpegは対応していないのでimage/jpegに置換している)
    request.ContentType = contentType.Replace("/pjpeg", "/jpeg")

    ' バイナリデータの指定
    request.ContentLength = data.Length
    Dim stream As System.IO.Stream = request.GetRequestStream
    stream.Write(data, 0, data.Length)

    Try
        Using response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse)
            document.InnerXml = "<response>" & response.StatusCode & "</response>"
        End Using
        Return document
    Catch webEx As WebException
        document.InnerXml = "<exception>" & webEx.Message & "</exception>"
        Return document
    End Try
End Function

アップロードできるファイルの種類はSDK文書には公開されていませんが,あまり多くないようです。画像の場合はJPEG,PNG,GIF形式のものを受け付けます。ファイルの種類は指定したContentTypeによって判別されます。JPEGの場合,ContentTypeを⁠image/pjpeg⁠と指定するとエラーレスポンスが返ります。⁠image/jpeg⁠としても問題ないためコード中では置換操作をしています。文書形式で対応しているものは,テキストファイル(text/plane)程度のようです。

上記のUploadFileメソッドをUploadボタンクリック時に呼び出し,FileUploadコントロールに指定されたファイルをアップロードするようにします。コードを以下に示します。

Protected Sub UploadButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles UploadButton.Click
    If ResourceTreeView.CheckedNodes.Count <> 1 OrElse _
        Not ResourceTreeView.CheckedNodes(0).Value.EndsWith("/Items") Then
        MessageLiteral.Text = "フォルダをひとつチェックしてください。"
        Exit Sub
    ElseIf Not FileUpload.HasFile Then
        MessageLiteral.Text = "アップロードするファイルを入力してください。"
        Exit Sub
    End If

    Dim document As XmlDocument = UploadFile(ResourceTreeView.CheckedNodes(0).Value, _
                                             HttpUtility.UrlEncode(FileUpload.FileName), _
                                             FileUpload.FileBytes, _
                                             FileUpload.PostedFile.ContentType)

    If document.SelectNodes("/exception").Count > 0 Then
        MessageLiteral.Text = document.SelectNodes("/exception").Item(0).InnerText
    Else
        ResourceTreeView.CheckedNodes(0).Select()
        ResourceTreeView_SelectedNodeChanged(Me, New EventArgs)
    End If
End Sub

アップロードするファイルのバイトデータはFileBytesプロパティから,ContentTypeはPostedFile.ContentTypeプロパティから取得できます。アップロードする際に付けるファイル名は指定されたファイル名をそのまま利用していますが,日本語は使用できないためURLエンコードしています。

フォルダ・ファイルの削除

フォルダ・ファイルの削除にはDELETEメソッドを使用します。一度のリクエストで削除できるのはひとつのフォルダまたはファイルだけです。フォルダを削除した場合,そのフォルダ以下のアイテムも削除されます。リソースへのパスはアイテムを表すパスを指定します。削除に成功した場合はステータスコード200(OK)が応答されます。

削除を行うコードは次のようになります。

Protected Function DeleteFoldoerOrFile(ByVal path As String) As XmlDocument
    Dim document As New XmlDocument
    Dim request As HttpWebRequest = CreatedNewRequest(path, "DELETE")

    Try
        Using response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse)
            document.InnerXml = "<response>" & response.StatusCode & "</response>"
        End Using
        Return document
    Catch webEx As WebException
        document.InnerXml = "<exception>" & webEx.Message & "</exception>"
        Return document
    End Try
End Function

「Delete a Folder or File」ボタンをクリックしたときに,DeleteFoldoerOrFileメソッドを呼ぶようにします。

Protected Sub DeleteButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles DeleteButton.Click
    If ResourceTreeView.CheckedNodes.Count <> 1 Then
        MessageLiteral.Text = "フォルダまたはファイルををひとつチェックしてください。"
        Exit Sub
    End If

    Dim value As String = ResourceTreeView.CheckedNodes(0).Value

    ' アイテムを示すパスに変換(末尾の/Itemsなど部分を削除)
    Dim path As String = value.Substring(0, value.LastIndexOf("/"))

    Dim document As XmlDocument = DeleteFoldoerOrFile(path)
    If document.SelectNodes("/exception").Count > 0 Then
        MessageLiteral.Text = document.SelectNodes("/exception").Item(0).InnerText
    Else
        ResourceTreeView.CheckedNodes(0).Parent.Select()
        ResourceTreeView_SelectedNodeChanged(Me, New EventArgs)
    End If
End Sub

フォルダ名変更のときと同様にTreeNode.Valueプロパティの値からアイテムのパスを作りメソッドに渡しています。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp