2009-08-12 2 views
1

Мое веб-приложение состоит из изображений, хранящихся в SQL Server db. И у меня есть приложение silverlight на стороне клиента. Веб-приложение позволит клиентам загружать файл с сервера, запуская загрузку в приложении silverlight. Silverlight разговаривает с веб-службой, чтобы загрузить файл.Дизайн для загрузки файлов с веб-сервера

Я пытаюсь понять логику загрузки файла в конце веб-службы. Я мог бы придумать следующие подходы:

1) Прочитайте данные из памяти в память. Запись данных памяти в файл на сервере. Верните путь сервера к клиенту. Клиент будет вызывать метод HtmlPage.Window.Navigate с URL-адресом, чтобы пригласить пользователя загрузить файл.

Недостаток подхода:
- Данные db необходимо записывать в файл каждый раз, чтобы загрузить. Несколько одновременных запросов на загрузку файлов могут затормозить пространство на жестком диске на веб-сервере.

Есть ли другой способ загрузить файл? Использует ли FILESTREAM какие-либо лучшие альтернативы?

Цените свой ответ!

ответ

3

Поскольку у вас уже есть БД с изображениями в БД, я буду замаскировать весь «должен ли я хранить изображения в вопросе БД». Я только упоминаю об этом здесь, потому что я уверен, что другие прокомментируют это и докажут, что не упоминаю, что это не лучшая идея. Я просто отвечу на ваш вопрос, насколько смогу.

У вас есть веб-служба, которая возвращает изображение напрямую. Это довольно просто ...

Вот фрагмент кода из веб-сервиса, который я написал, чтобы увидеть, можете ли вы это сделать. Надеюсь, вы можете изменить его для своих нужд.

<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

Это ответ Дэвид Stratton, всего очищены:

<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

Смежные вопросы