2009-08-12 10 views
1

私のWebアプリケーションは、SQL Serverデータベースに格納されたイメージで構成されています。そして、私はクライアント側に銀色のアプリを持っています。 Webアプリケーションを使用すると、Silverlightアプリでダウンロードを開始することで、クライアントがサーバーからファイルをダウンロードできるようになります。 SilverlightはファイルをダウンロードするためにWebサービスと話します。Webサーバーからファイルをダウンロードするためのデザイン

ウェブサービスの終了時にファイルのダウンロードロジックを理解しようとしています。私は以下のアプローチを考え出すことができました:

1)データベースからメモリにデータを読み込みます。メモリデータをサーバ上のファイルに書き込みます。クライアントへのサーバーパスを返します。クライアントは、urlでHtmlPage.Window.Navigateメソッドを呼び出して、ユーザーにファイルのダウンロードを促します。

アプローチの短所:
- ダウンロードするたびにdbからのデータをファイルに書き込む必要があります。同時に複数のファイルのダウンロード要求が発生すると、Webサーバー上のハードドライブのスペースが詰まる可能性があります。

ファイルをダウンロードする方法はありますか? FILESTREAMの使用法はより良い選択肢を提供しますか?

感謝しています。

答えて

3

DBのイメージを持つDBを既に取得しているので、「DBの質問にイメージを格納する必要がありますか?私は他の人がそれについてコメントし、それがベストアイデアではないと言及しなかった点を私に教えてくれると確信しているので、ここでしか言及しない。私はできる限りあなたの質問に答えるだけです。

Webサービスで直接画像を返すことができます。それはかなり簡単です...

ここで私はあなたがそれを行うことができるかどうかを確認するために書いたWebサービスからコードスニペットです。うまくいけば、必要に応じて変更することができます。

<WebMethod()> _ 
    Public Function GetImage() As Byte() 
     Try 
      Dim outStream As New System.IO.MemoryStream 
      Dim REturnValue As New System.Drawing.Bitmap(500, 500) 
      Dim g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(REturnValue) 
      'g.RotateTransform(5) 
      Dim f As New System.Drawing.Font(System.Drawing.FontFamily.GenericMonospace, 16, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Point) 
      Dim b As System.Drawing.Brush = Drawing.Brushes.Lime 

      g.DrawString("Hello", f, b, 0, 0) 
      g.DrawString("Would you like to play a game? (Y/N)", f, b, 0, 40) 
      g.DrawString("> Y", f, b, 0, 80) 
      g.DrawString("Loading Global Thermonuclear War,", f, b, 0, 120) 
      g.DrawString("please wait...", f, b, 0, 160) 
      REturnValue.Save(outStream, System.Drawing.Imaging.ImageFormat.Jpeg) 

      Return outStream.ToArray() 
     Catch ex As Exception 
      Throw New Exception(ex.ToString()) 
     End Try 

    End Function 

して、画像を表示するAsp.Netページ..

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim ts As New TestServices 
     Dim b As System.Drawing.Bitmap 
     Dim bytes As Byte() 
     Dim inStream As System.IO.MemoryStream 

     bytes = ts.GetImage() 
     inStream = New System.IO.MemoryStream(bytes) 
     b = New System.Drawing.Bitmap(inStream) 
     Response.ContentType = "image/jpeg" 
     b.Save(Response.OutputStream, b.RawFormat) 
     b.Dispose() 
    End Sub 
+0

ウエッ!使用しない/使用しない。それに対して-1。 –

2

これは単にクリーンアップ、デビッド・ストラットンの答えです:

<WebMethod()> _ 
Public Function GetImage() As Byte() 
    Using outStream As New System.IO.MemoryStream 
     Using ReturnValue As New System.Drawing.Bitmap(500, 500) 
      Using g As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(ReturnValue) 
       'g.RotateTransform(5) 
       Using f As New System.Drawing.Font(System.Drawing.FontFamily.GenericMonospace, 16, Drawing.FontStyle.Regular, Drawing.GraphicsUnit.Point) 
        Dim b As System.Drawing.Brush = Drawing.Brushes.Lime 

        g.DrawString("Hello", f, b, 0, 0) 
        g.DrawString("Would you like to play a game? (Y/N)", f, b, 0, 40) 
        g.DrawString("> Y", f, b, 0, 80) 
        g.DrawString("Loading Global Thermonuclear War,", f, b, 0, 120) 
        g.DrawString("please wait...", f, b, 0, 160) 
        ReturnValue.Save(outStream, System.Drawing.Imaging.ImageFormat.Jpeg) 

        Return outStream.ToArray() 
       End Using 
      End Using 
     End Using 
    End Using 
End Function 


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Using ts As New TestServices 
     Dim bytes As Byte() = ts.GetImage() 
     Using inStream As System.IO.MemoryStream = New System.IO.MemoryStream(bytes) 
      Using b As System.Drawing.Bitmap = New System.Drawing.Bitmap(inStream) 
       Response.ContentType = "image/jpeg" 
       b.Save(Response.OutputStream, b.RawFormat) 
      End Using 
     End Using 
    End Using 
End Sub 
+0

それははるかによく見えます。 – David