Avatar billede dex_dexter Nybegynder
13. december 2005 - 09:37 Der er 30 kommentarer og
1 løsning

hente binær fil fra mssql

jeg har en tabel i en sqldatabase som indeholder et id felt og et datafelt, datafeltet er af typen binary, deri har jeg lavet et script der kan uploade filer til, men hvordan får jeg dem hentet?
jeg har brug for at lave en side hvor man angiver id´et og så kan man hente filen.
jeg har søgt, både her på eksperten, men også generelt og har ikke kunnet finde noget som kunne give mig en idé om hvordan det skal gøres.
Avatar billede dr_chaos Nybegynder
13. december 2005 - 09:51 #1
du kan gemme filen i et byte array også streame det til brugeren.
Avatar billede dex_dexter Nybegynder
13. december 2005 - 09:55 #2
jeg har hentet dataen ud som et byte array, og har læst mig til at jeg kan bruge
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(bytearray);
er jeg forkert på den?
Avatar billede dr_chaos Nybegynder
13. december 2005 - 09:59 #3
nej ikke helt.

Response.Clear();
        Response.ContentType = "application/octet-stream";
        Response.AddHeader("content-length", System.Convert.ToString(Buffer.Length));
        Response.BinaryWrite(Buffer);
        Response.Flush();
        Response.End();
Avatar billede dr_chaos Nybegynder
13. december 2005 - 09:59 #4
hvor buffer er dit byte array.
men har filen ikke nogen extension ?
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:02 #5
efter
Response.ContentType = "application/octet-stream";
skal du tilføje :
Response.AddHeader("Content-Disposition", _
  "attachment; filename=""" & filename & """")
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:09 #6
hvor filename så er filnavnet jeg vil levere til browseren vel sagtens?
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:11 #7
ja jeg har f.eks. denne her i en pdf streamer jeg har lavet:
Response.AddHeader("Content-Disposition", "attachment;filename=NothingSpecial.pdf") ;
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:12 #8
hvis filen er af en bestemt type så kan du evt hardcode navnet.
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:17 #9
det er flere forskellige filer jeg skal levere, så jeg må lave noget der selv finder ud af det, men det burde ikke være et problem.

jeg har filen liggende i sql tabellen, men kan se at mit bytearray converting ikke helt virker som det skal, hvordan har du gjort det? jeg hiver det ud via en mycommand.executescalar(); men hvordan kommer jeg så derfra og til et bytearray
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:24 #10
prøv med noget lignende:

byte [] buffer = (byte [])reader[11];
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:28 #11
øh, jeg er ikke helt med, men jeg har forsøgt sådan har

byte[] buffer = (byte[])mycommand.ExecuteScalar();
men det giver mig åbenbart kun første byte.
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:30 #12
prøv lige at vise mig hele din kode.
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:33 #13
jeg tror jeg har fundet ud af at det er min uploadkode der kun smider første byte op, hvis jeg kigger på dataen rå så står der noget der ligner :"0x6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
"

hvilket for mig ser ud som et enkelt tegn.
eller er det mig der er forkert på den igen?
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:34 #14
det ser sådan ud.
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:34 #15
hvordan ser din upload kode ud ?
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:36 #16
SqlCommand cmdUploadDoc;
            int intDocLen = txtFileContents.PostedFile.ContentLength;
            byte[] Docbuffer = new byte[intDocLen];
            Stream objStream;
            objStream = txtFileContents.PostedFile.InputStream;
            objStream.Read(Docbuffer,0,intDocLen);

            cmdUploadDoc = new SqlCommand("upload",sqlConnection1);
            cmdUploadDoc.CommandType = CommandType.StoredProcedure;
            cmdUploadDoc.Parameters.Add("@doc",SqlDbType.Binary);

            cmdUploadDoc.Parameters[0].Value = Docbuffer ;

            sqlConnection1.Open();
            cmdUploadDoc.ExecuteNonQuery();
            sqlConnection1.Close();

upload er en stored procedure som bare laver en insert
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:37 #17
prøv lige at tjekke hvad intDocLen  er når du uploader.
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:40 #18
den viser fint hvad jeg uploader, den returnerer 840 ved en 840 bytes fil
Avatar billede dr_chaos Nybegynder
13. december 2005 - 10:50 #19
hvad er længden på Docbuffer ?
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:53 #20
19968
Avatar billede dex_dexter Nybegynder
13. december 2005 - 10:55 #21
hvis jeg printer den rå data fra docbuffer direkte på skærmen så ser det også ud som om det virker, får i alt fald dataen fra et helt almindeligt text dokument smidt i hovedet.
Avatar billede dr_chaos Nybegynder
13. december 2005 - 11:04 #22
prøv evt at gemme data i et image field i stedet for et binary field.
Avatar billede dex_dexter Nybegynder
13. december 2005 - 11:07 #23
jeg har prøvet at "fake" noget data, simpelthen ved bare at skrive 0x23023425 osv derudaf, og så kan jeg fint hente det ud igen, så det må være selve upload proceduren der kun smider den første byte op på serveren, men hvorfor kan jeg ikke lige se
Avatar billede dr_chaos Nybegynder
13. december 2005 - 11:14 #24
doh
du mangler en længde på:
cmdUploadDoc.Parameters.Add("@doc",SqlDbType.Binary);
prøv med noget i den stil :

cmdUploadDoc.Parameters.Add("@doc",SqlDbType.Binary,20000);

eller hvor stort dit felt nu er i db.
Avatar billede dex_dexter Nybegynder
13. december 2005 - 11:22 #25
0x6200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

hvilket ikke er en ændring i forhold til hvad der stod før
Avatar billede dr_chaos Nybegynder
13. december 2005 - 11:37 #26
prøv lige at tjekke

  cmdUploadDoc.Parameters[0].Size
Avatar billede dex_dexter Nybegynder
13. december 2005 - 12:27 #27
hm.. den gider mig bare 0
Avatar billede dr_chaos Nybegynder
13. december 2005 - 12:55 #28
prøv lige med:

SqlCommand cmdUploadDoc;
            int intDocLen = txtFileContents.PostedFile.ContentLength;
            byte[] Docbuffer = new byte[intDocLen];
            Stream objStream;
            objStream = txtFileContents.PostedFile.InputStream;
            objStream.Read(Docbuffer,0,intDocLen);
            sqlConnection1.Open();
            cmdUploadDoc = new SqlCommand("upload",sqlConnection1);
            cmdUploadDoc.CommandType = CommandType.StoredProcedure;
            cmdUploadDoc.Parameters.Add("@doc",SqlDbType.Binary);

            cmdUploadDoc.Parameters[0].Value = Docbuffer ;

           
            cmdUploadDoc.ExecuteNonQuery();
            sqlConnection1.Close();
Avatar billede dex_dexter Nybegynder
13. december 2005 - 14:58 #29
grmbl, verdens dummeste fejl er nu fundet, den stored procedure der håndterede det havde en variable der bare var sat til at være binary, og ikke binary(x), dvs den kun kunne indeholde 1 byte
da det blev rettet kørte det, ret dumt :(

smid et svar, du har trodsalt brugt ret langt tid på mig idag
Avatar billede dr_chaos Nybegynder
13. december 2005 - 18:48 #30
hehe svar :)
Avatar billede dr_chaos Nybegynder
04. februar 2006 - 17:03 #31
Du mangler at lukke spørgsmålet.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester