2008-10-27 8 views
1

J'ai un site Web ASP .Net (3.5). J'ai le code suivant qui télécharge un fichier en tant que binaire à une base de données SQL:Obtenir des données binaires à partir d'une base de données SQL

Print("   
      protected void UploadButton_Click(object sender, EventArgs e) 
      { 

      //Get the posted file 
      Stream fileDataStream = FileUpload.PostedFile.InputStream; 

      //Get length of file 
      int fileLength = FileUpload.PostedFile.ContentLength; 

      //Create a byte array with file length 
      byte[] fileData = new byte[fileLength]; 

      //Read the stream into the byte array 
      fileDataStream.Read(fileData, 0, fileLength); 

      //get the file type 
      string fileType = FileUpload.PostedFile.ContentType; 

      //Open Connection 
      WebSysDataContext db = new WebSysDataContext(Contexts.WEBSYS_CONN()); 

      //Create New Record 
      BinaryStore NewFile = new BinaryStore(); 

      NewFile.BinaryID = "1"; 
      NewFile.Type = fileType; 
      NewFile.BinaryFile = fileData; 

      //Save Record 
      db.BinaryStores.InsertOnSubmit(NewFile); 

      try 
      { 
       db.SubmitChanges(); 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     }"); 

Les fichiers qui seront téléchargés sont au format PDF, pouvez-vous s'il vous plaît me aider à écrire le code pour obtenir le PDF de SQL base de données et l'afficher dans le navigateur. (Je suis capable d'obtenir le fichier binaire en utilisant une requête linq mais je ne sais pas comment traiter les octets)

Répondre

1

Alors, êtes-vous vraiment juste après comment servir un tableau d'octets dans ASP.NET? Il semble que la partie base de données ne soit pas pertinente, étant donné que vous avez dit que vous êtes en mesure d'obtenir le fichier binaire avec une requête LINQ.

Si oui, regardez HttpResponse.BinaryWrite. Vous devez également définir le type de contenu de la réponse de manière appropriée, par ex. application/pdf.

+0

J'ai essayé ce que vous mettez et j'ai ajouté un commentaire ci-dessous. –

0

Quelle est la taille des fichiers? Les buffers énormes (c'est-à-dire byte [fileLength]) sont généralement une mauvaise idée.

Personnellement, je regarderais des choses comme this et this, qui montrent la lecture/écriture de données en tant que flux (la seconde montre en poussant le flux comme une réponse http). Mais mis à jour pour utiliser varchar (max) ;-P

0

Test_Click protected void (object sender, EventArgs e) {

 WebSysDataContext db = new WebSysDataContext(Contexts.WEBSYS_CONN()); 

     var GetFile = from x in db.BinaryStores 
         where x.BinaryID == "1" 
         select x.BinaryFile; 

     FileStream MyFileStream; 
     long FileSize; 

     MyFileStream = new FileStream(GetFile, FileMode.Open); 
     FileSize = MyFileStream.Length; 

     byte[] Buffer = new byte[(int)FileSize]; 
     MyFileStream.Read(Buffer, 0, (int)FileSize); 
     MyFileStream.Close(); 

     Response.Write("<b>File Contents: </b>"); 
     Response.BinaryWrite(Buffer); 

    } 

I tryed ceci et cela n'a pas fonctionné. Je reçois une erreur de compilation sur cette ligne "MyFileStream = new FileStream (GetFile, FileMode.Open);" Je ne sais pas où je vais mal, est-ce dû à la façon dont je l'ai stocké?

+0

Nous n'avons aucune idée de ce que le type de variable "GetFile" est ... mais vous ne devriez pas du tout avoir besoin d'un FileStream, si c'est de la base de données en mémoire. –

+0

Pourrais-je avoir un exemple à ce sujet? –

0

Lorsque vous stockez des fichiers binaires dans SQL Server, il ajoute un en-tête OLE aux données binaires. Vous devez donc supprimer cet en-tête avant de lire le byte [] dans le fichier. Voici comment vous faites cela.

// First Strip-Out the OLE header 
const int OleHeaderLength = 78; 

int strippedDataLength = datarow["Field"].Length - OleHeaderLength; 

byte[] strippedData = new byte[strippedDataLength]; 

Array.Copy(datarow["Field"], OleHeaderLength, 
    strippedData , 0, strippedDataLength); 

Une fois que vous exécutez ce code, strippedData contiendra les données du fichier réel. Vous pouvez ensuite utiliser MemoryStream ou FileStream pour effectuer des E/S sur l'octet [].

Hope this helps ..

Ruchit S.