DEXTUpload.NET Professional
menu toggle製品の説明 > ファイルのダウンロード

ファイルのダウンロード

一般的に、HTTP GET / POSTリクエストに対するサーバの応答データをブラウザが解釈できない形式である場合には、特異点がない以上、ブラウザは、ターゲットを、添付ファイルのようにダウンロードする。

例えば、Anchor(a)タグに設定されたハイパーリンクを介してダウンロードしたデータは、ブラウザが解釈することができるjpgファイルであれば、別ウィンドウ(またはタブ)、または現在のウィンドウに画像が表示されるが、それとは別の方法でzipファイルの場合には、一般的に、すぐにダウンロードを実行する。もしjpgファイルのようにブラウザが解釈することができるファイルをブラウザの処理に任せず、ディスクに直接ダウンロードするには、ブラウザ自体の機能(コンテキストメニュー - 名前を付けて保存)に依存したり、サーバーからブラウザが強制的にダウンロードできるようにするレスポンスヘッダを載せなければならない。HTML5には、対象の型(mime type)に関係なく、強制的にファイルをダウンロードできるようにする属性が新たに追加されたが、すべてのブラウザでサポート(2016年初め基準)せずにおり、純粋にクライアントの設定だけでファイルをダウンロードすることができない。

DEXTUpload.NET Professional製品は、サーバー上のファイルまたはファイルではなく、データをブラウザの解釈なし添付ファイルの形で直接ダウンロードすることができるように処理をする。

//リソースをそのまま公開する場合だ。
<a href="http://domain/path/Music/Beethoven/Moonlight.mp3">ベートーベン月光ソナタ</a>
// download.ashxジェネリックハンドラを介してファイルをダウンロードを提供して、ダウンロードするファイルを指す12345キーを提供することにより、ターゲットファイルをダウンロードすることができますが、実際のパスは露出しないようにすることができる。
<a href="http://domain/path/download.ashx?key=12345">ベートーベン月光ソナタ</a>

一般的に、DEXTUpload.NET Professional製品を使用してダウンロードをするということは、対象ファイルのパスを隠匿したり、またはリンク先のファイルのパスは、Webに公開されていない位置にある環境の場合である。したがって、ファイルをダウンロードするには、ファイルをダウンロードすることができるaspxページまたはashx汎用ハンドラを提供しなければならない。

ファイルをダウンロードするために「DEXTUpload.NET.FileDownload」クラスを使用する。

public class download : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        var key = context.Request.QueryString["key"] ?? string.Empty;
        // keyに対応するファイルのパスを得る。
        // ... 省略
        var file = new FileInfo("ファイルパス");
        using (var dext = new FileDownload())
        {
            dext.Download(file);
        }
        //ダウンロード操作の後に「Response.Write」メソッドを使用して応答データにデータを記録するべきでない。
    }
    ...
}

ファイルのダウンロードをするとき、クライアントでは、GETではなく、POSTでリクエストすることをお勧めしていない。ファイルのダウンロードされるのは、クライアントのデータをサーバーに送信して状態を更新することが目的ではないからである。(システムの状態を変えない要求は、GETメソッドを使用するように勧めます。しかし、パスワードなどのデータをしたい、または、フォームデータの量が多かったり、バイナリデータを転送する場合は、POSTを使うしかない。)

加えてASP.NET環境では、バイナリデータを得ようとするときは、aspxページではなく、ashx汎用ハンドラを使用することを推奨する。aspxページの場合には、ビハインドコード(cs)からダウンロードコードを作成したとしても、aspxファイルに含まれているタグがダウンロードデータと重ねて書き込ま可能性が多いからである。もちろんaspxページに表示器を除いた残りの部分をすべての要素を削除するとされるが、開発者のミスにより空の文字列のような部分が残ることがありますので、問題が十分に発生することができる。したがって、aspxページを介してダウンロードするか、またはポストバック機能を使用しないように推奨している。

DEXTUpload.NET Professional製品は、ASP.NET MVC環境のためのファイルのダウンロード機能は提供しない。代わりに「System.Web.Mvc.FileContentResult」クラスを使用してファイルをダウンロードするように実装すればよい。