バケットにファイルをアップロードする
作成したバケットにファイルをアップロードします。必要な情報は
- アクセストークン data:create または data:write (既存のファイルは上書き)
- バケットキー ファイルをアップロードするバケット
です。ここでもRestSharpを使ってファイルをアップロードしてみます。ユーザーインターフェイスは前回のバケット一覧を少し改造して、下の図のようにしてみました。
WebForm3.aspx |
サンプルコード
アップロードボタンのクリックイベントのハンドラを示します。
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 件のコメント:
コメントを投稿