none
WindowsAzure ファイルのダウンロードについて

    質問

  • お世話になります。

    開発環境:
    Windows 7
    SQL Server 2008 R2 Developer Edition
    Visual Studio 2010 (開発言語は ASP.net/コードビハインドはVB.net)
    Windows Azure SDK v1.4
    Windows Azure Tools for Microsoft Visual Studio 2010 1.3
    .Net Framework 4


    現在AzureのストレージサービスであるBlobに
    ファイルをアップロード・ダウンロードするプログラムを作成中なのですが、
    ファイルのダウンロードのやり方が分からず困っています。

    Web上にあるいろんなサンプルプログラムを参考にしながら、
    ExcelやPDF、テキストファイルなどのファイルを
    アップロードさせてみるところまではたどり着きました。
    今度はそのアップロードしたファイルをダウンロードさせようとして
    悩んでいます…


    以下の2つの方法を試しました。

    1.CloudBlockBlobオブジェクトのDownloadToFileメソッドを使用して
    ローカルの指定のフォルダにダウンロードさせる。
    コードは

    Dim connectionString = RoleEnvironment.GetConfigurationSettingValue("Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString")
    Dim account = CloudStorageAccount.Parse(connectionString)
    Dim blobClient As CloudBlobClient = account.CreateCloudBlobClient()
    Dim container As CloudBlobContainer = blobClient.GetContainerReference("test")
    container.CreateIfNotExist()
    Dim blob As CloudBlockBlob = container.GetBlockBlobReference(テキストボックスに直接入力したファイル名)
    blob.DownloadToFile("C:\" + テキストボックスに直接入力したファイル名)

    →開発環境ではOKですがAzure上ではエラーになります(当たり前ぽいですが…)
    (開発環境でもダウンロードするかどうか問ういつものダイアログボックスは出現しませんでした)

    2.何とかダウンロードできないかと、ContentTypeを指定して
    System.Web.HttpContext.Current.Response.WriteFile(ファイルパスのURL)
    を使用
    →ダウンロードするかどうか問ういつものダイアログボックスは出現しましたが、
    表示している画面のソース(HTML)がダウンロードされます


    何か違う方法があるのかただやり方がわるいだけなのか、
    言葉足らずで分かりにくいところもあるかと思いますが
    どうかご教授ください。
    よろしくお願いいたします。

     

    2011年9月17日 8:55

回答

  • 誰が、どこから、どこへ、ダウンロードしたいのでしょうか?

    ざっと読むかんじでは、

    Windows Azure 上に展開された WebRole の上で動く ASP.NET アプリケーションを使って、Windows Azure の外からアクセスしてきたユーザが、Web アプリケーション上で指定したファイルを、ユーザ自身の手元にダウンロードしたいということでしょうか?

    上のように想像すると、Windows Azure では ASP.NET アプリケーションからファイルをダウンロードさせようとすると、ロードバランサの接続制限に引っかかってしまって難しいため、通常は Blob ストレージの URL を指定してユーザのアクセスを誘導したりリダイレクトします。

    > System.Web.HttpContext.Current.Response.WriteFile(ファイルパスのURL)

    ファイルパスのURLはBlobストレージでのURLでしょうか? であれば、ここを WriteFile ではなく Redirect に変更すれば完成しそうな気はします。(アクセス制御の都合とかがない、公開されたものであるなら)

     

    • 回答としてマーク sanai-net 2011年9月19日 1:57
    2011年9月17日 10:48

すべての返信

  • 誰が、どこから、どこへ、ダウンロードしたいのでしょうか?

    ざっと読むかんじでは、

    Windows Azure 上に展開された WebRole の上で動く ASP.NET アプリケーションを使って、Windows Azure の外からアクセスしてきたユーザが、Web アプリケーション上で指定したファイルを、ユーザ自身の手元にダウンロードしたいということでしょうか?

    上のように想像すると、Windows Azure では ASP.NET アプリケーションからファイルをダウンロードさせようとすると、ロードバランサの接続制限に引っかかってしまって難しいため、通常は Blob ストレージの URL を指定してユーザのアクセスを誘導したりリダイレクトします。

    > System.Web.HttpContext.Current.Response.WriteFile(ファイルパスのURL)

    ファイルパスのURLはBlobストレージでのURLでしょうか? であれば、ここを WriteFile ではなく Redirect に変更すれば完成しそうな気はします。(アクセス制御の都合とかがない、公開されたものであるなら)

     

    • 回答としてマーク sanai-net 2011年9月19日 1:57
    2011年9月17日 10:48
  • K.Takaoka様、ご回答ありがとうございます。

    > Windows Azure 上に展開された WebRole の上で動く ASP.NET アプリケーションを使って、Windows Azure の外からアクセスしてきたユーザが、
    > Web アプリケーション上で指定したファイルを、ユーザ自身の手元にダウンロードしたいということでしょうか?

    そうです、お言葉のとおりの動作をさせたいと思っております。
    説明が足りず、申し訳ありません。


    > 上のように想像すると、Windows Azure では ASP.NET アプリケーションからファイルをダウンロードさせようとすると、
    > ロードバランサの接続制限に引っかかってしまって難しいため、通常は Blob ストレージの URL を指定して
    > ユーザのアクセスを誘導したりリダイレクトします。

    そうなんですね!
    勉強が足らず、お恥ずかしい限りです…


    > ファイルパスのURLはBlobストレージでのURLでしょうか?
    > であれば、ここを WriteFile ではなく Redirect に変更すれば完成しそうな気はします。
    > (アクセス制御の都合とかがない、公開されたものであるなら)

    この部分もまったくお言葉のとおりです。
    いただいたアドバイスどおり、Redirectに変更してみたところ、
    ユーザ自身の手元にダウンロードさせることができました!
    ありがとうございました。

    まだ細かい動作まではプログラムを作りこめていませんが、
    取り急ぎご報告させていただきます。
    本当にありがとうございました。

    2011年9月19日 1:57