2017年2月1日水曜日

ファイルのアップロード +VB.net

バケットにファイルをアップロードする


作成したバケットにファイルをアップロードします。必要な情報は

  • アクセストークン data:create または  data:write (既存のファイルは上書き)
  • バケットキー   ファイルをアップロードするバケット

です。ここでもRestSharpを使ってファイルをアップロードしてみます。ユーザーインターフェイスは前回のバケット一覧を少し改造して、下の図のようにしてみました。
WebForm3.aspx
[参照]ボタンを押して選択したファイルを、lbxBucketsで選択したバケットに[アップロード]ボタンでアップロードし、そのObjectIDを取得して表示する、というシナリオです。

サンプルコード


アップロードボタンのクリックイベントのハンドラを示します。

    Protected Sub btnUpload_Click(sender As Object, e As EventArgs) Handles btnUpload.Click

        '**********************************
        ' アップロードするファイルを取得
        '**********************************

        'ファイルが選択されているか?
        If FileUpload1.HasFile = False Then
            MsgBox("ファイルが選択されていません。", MsgBoxStyle.OkOnly)
            Exit Sub
        End If

        'バケットにアップロードするファイル
        'FileUploadで転送されたファイル
        Dim fileToUpload As HttpPostedFile = FileUpload1.PostedFile

        'ファイル名(インターネットエクスプローラはフルパスを返す)
        Dim strFullPath As String = fileToUpload.FileName

        'ファイル名だけ取り出す
        Dim strFileName As String = IO.Path.GetFileName(strFullPath)

        '①ファイル名をURLエンコードする
        Dim strObjectKey As String = System.Web.HttpUtility.UrlEncode(strFileName)

        'ファイルの内容を読んでByteの配列とする
        Dim fileData As Byte() = Nothing
        Using binaryReader As New IO.BinaryReader(fileToUpload.InputStream)
            fileData = binaryReader.ReadBytes(fileToUpload.ContentLength)
        End Using


        '現在選択しているバケットキーを取得
        Dim strBucketKey As String = lbxBuckets.SelectedValue

        '**********************************
        '     アクセストークンを取得
        '**********************************

        Dim acToken As String = mdlUtils.GetToken("data:write")
        If acToken = "" Then
            Exit Sub
        End If

        '**********************************
        '     ファイルをアップロード
        '**********************************
        'RestSharpでクライアントを作成
        Dim url As String = "https://developer.api.autodesk.com"
        Dim _client As New RestSharp.RestClient(url)

        'RestSharpでリクエストを作成
        Dim authReq As New RestSharp.RestRequest()
        With authReq
            .Resource = "oss/v2/buckets/" + strBucketKey + "/objects/" + strObjectKey

            'メソッド
            .Method = RestSharp.Method.PUT

            'ヘッダー
            .AddHeader("Authorization", "Bearer " + acToken)

            'BODY
            .AddParameter("Content-Type", fileToUpload.ContentType)
            .AddParameter("Content-Length", fileToUpload.ContentLength)

            '②アップロードするファイルをリクエストボディに追加
            .AddParameter("requestBody", fileData, RestSharp.ParameterType.RequestBody)

        End With

        'リクエスト送信
        Dim result As RestSharp.IRestResponse = _client.Execute(authReq)

        '結果
        If result.StatusCode = Net.HttpStatusCode.OK Then

            'ObjectIdを取得する
            Dim responseString As String = result.Content
            'Newtonsont.JsonのJSON解読メソッドを使うと便利
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            'objectId
            lblObjectId.Text = jsonObj("objectId")

        Else
            Dim responseString As String = result.Content
            Dim jsonObj As Object = Newtonsoft.Json.JsonConvert.DeserializeObject(responseString)
            lblObjectId.Text = jsonObj("reason")

        End If

    End Sub

ポイントは①のファイルの名前をエンコードすることを忘れないようにするところと、②のファイルをBODYにテンプルすところです。

大きなサイズのデータを送れるようにする


ASP.netのFileUploadコントロールは転送できるファイルサイズが4MB程度に制限されているので、これを300MB(300×1024=307200KB)に緩和します。

ソリューションエクスプローラで「Web.config」ファイルを開き、17行目あたりにある
<httpRuntime targetFramework="4.6"/>
の末尾の/の前をクリックし、maxRequestLength="307200"と追記します。4.6"の後ろにスペースを空けて、maxと打てばインテリセンスが働いて、maxRequestを探すことができます。

  <system.web>
    <authentication mode="None" />
    <compilation debug="true" strict="false" explicit="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" maxRequestLength="307200" />
    <pages>
      <namespaces>
     ・・・・

実行する


デバッグ起動してバケットと、アップロードするファイルを選択して「アップロード」ボタンを押すと、ファイルサイズによっては時間がかかりますが、うまくいけばオブジェクトIDが返ってきます。


0 件のコメント:

コメントを投稿