2011-08-12 25 views
2

データベースからファイルをbyte []形式で取得しています。Linqがデータベースから取得する前に、ダウンロードダイアログを表示してもらいたいです。それはC#とASP.NETです。ファイルをダウンロードする前にダウンロードダイアログを表示するにはどうすればよいですか?

さて、それはこのようなものだ:

  1. ユーザーは、ファイルを選択し、それをクリックしてください。
  2. コードではクリックしたファイルのIDを取得し、Linqを使用してダウンロードしています。
  3. 次に、Response.OutputStream.Write(content、0、 content.Length)でファイルを送信します。
  4. データベースユーザーからファイルをダウンロードする前に、 ダウンロードダイアログは表示されません。

ファイルをダウンロードする前にダウンロードダイアログを表示するにはどうすればよいですか?

コード:IDによる
取得ファイル:

public static byte[] getFile(Guid id) 
{ 
    var linqFile = from file in MyDB.Files 
        where file.IdPliku.Equals(id) 
        select new 
        { 
         Content = file.Content 
        }; 

    return linqFile.ToList().FirstOrDefault().Content.ToArray(); 
} 

保存ファイル:

public void SaveFile(Guid fileID, string filename, string mimeTypes) 
{ 
    try 
    { 
     byte[] content = FileService.getFile(fileID); 
     Response.ClearContent(); 
     Response.ClearHeaders(); 
     Response.ContentType = mimeTypes; 
     Response.AppendHeader("Accept-Ranges", "bytes"); 
     Response.AppendHeader("Content-Range", string.Format("0-{0}/{1}", content.Length, content.Length)); 
     Response.AppendHeader("Content-Length", content.Length.ToString()); 
     Response.AppendHeader("Content-Encoding", "utf-8"); 
     Response.AppendHeader("Content-Type", Response.ContentType); 
     Response.AppendHeader("Content-Disposition", "attachment; filename= " + HttpUtility.UrlEncode(filename)); 
     Response.OutputStream.Write(content, 0, content.Length); 
     //Response.BinaryWrite(content); 
     Response.Flush(); 
    } 
    finally 
    { 
     Response.Close(); 
    } 
} 

あなたは私の希望です。

+0

そして、ユーザーが「保存」をクリックしたとき(ファイルがダウンロードされていないため)に何が保存されるはずですか? – Mrchief

+0

ダウンロードのビルドを開始する前に、ヘッダーを出力して本文を開始する必要があります。これは、その時点でまだコンテンツが構築されていないため、コンテンツ長ヘッダーがないことを意味します。 –

+0

最初にファイルを選択したとき(「模擬ファイル」を介して)、実際のファイルがデータベースから読み込まれたときに2回目にダウンロードを受け入れるようにしますか?それ以外の場合は、彼が彼が要求していない何かを固定することができるので、それはセキュリティ上の脆弱性のように聞こえるので、2番目のダイアログを避ける方法を想像することはできません。 –

答えて

1

あなたの問題はここにある:

byte[] content = FileService.getFile(fileID); 

ので、この行には、WebサーバーのRAMでファイル全体を割り当てると、そこにデータベースからファイルのすべての内容をすべてを置きます。後で何が起こるかはもう重要ではありません。これはすでにdbからWebサーバーにダウンロードしているためです。

私は数週間前と全く同じ質問に全く同じコメントを書いたと確信していますので、このようなDeja-vuを持っています。それで今見つけることができません、ここでこのようなものを探してください。

実際には、上記のbyte []配列の割り当てを避けて、レスポンスの出力ストリームに直接ストリームを送信するというソリューションがあります。データレイヤを取得するにはもちろんそれをサポートする必要があります。この。 SQL Serverのファイルストリームなどを使用したいとします。

+1

が見つかりました。これを見てください:http:// stackoverflow。com/questions/6959196/how-to-perform-a-download-instantly-asp-net-c –

+0

ここでStreamsで何かしようとします。ありがとう;)。 私はLinqによってDBからファイルをストリームできることを願っています。 – Mattaniel

関連する問題