2009-08-12 7 views
1

Mon application Web est constituée d'images stockées dans la base de données SQL Server. Et, j'ai une application Silverlight sur le côté client. L'application Web permettrait aux clients de télécharger le fichier à partir du serveur en déclenchant le téléchargement dans l'application Silverlight. Silverlight parle au service Web pour télécharger le fichier. J'essaie de comprendre la logique de téléchargement de fichiers à la fin du service Web. Je pourrais venir avec les approches suivantes:Conception pour le téléchargement de fichiers à partir d'un serveur Web

1) Lire les données de DB à la mémoire. Ecrivez les données de la mémoire dans un fichier sur le serveur. Renvoie le chemin du serveur au client. Le client appelle la méthode HtmlPage.Window.Navigate avec l'URL pour inviter l'utilisateur à télécharger le fichier.

Inconvénient de l'approche:
- Les données de la base de données doivent être écrites dans le fichier à chaque téléchargement. Plusieurs demandes simultanées de téléchargement de fichiers peuvent obstruer l'espace du disque dur sur le serveur Web.

Existe-t-il une autre approche pour télécharger le fichier? L'utilisation de FILESTREAM fournit-elle de meilleures alternatives?

Appréciez votre réponse!

Répondre

3

Puisque vous avez déjà la base de données avec les images dans la base de données, je passerai la souris sur l'ensemble "devrais-je stocker des images dans la question DB". Je ne le mentionne ici que parce que je suis sûr que d'autres vont le commenter et m'accorder des points pour ne pas mentionner que ce n'est pas la meilleure idée. Je vais juste répondre à votre question du mieux que je peux.

Vous pouvez demander à un service Web de renvoyer une image directement. C'est assez simple ...

Voici un extrait de code d'un service Web que j'ai écrit juste pour voir si vous pouvez le faire. J'espère que vous pouvez le modifier pour vos besoins.

<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 

puis la page Asp.Net qui affiche l'image ..

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

Beurk! Pas d'utilisation/Fin Utilisation. -1 pour ça. –

2

C'est la réponse de David Stratton, juste assainis:

<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

Cela semble beaucoup mieux. – David

Questions connexes