17. februar 2005 - 13:44Der er
21 kommentarer og 1 løsning
Gemme pdf-fil i database
Hey.
Jeg står og skal kunne gemme pdf-filer og doc-filer osv. i en ms sql database og har ledt og ledt og ledt på nettet efter info omkring hvordan man gør. men kan simpelthen ikke finde noget brugbart. jeg går ud fra at jeg skal lave pdf-filen om til en stream og derefter gemme det i databasen. men hvordan laver jeg så streamen om til en pdf fil igen?
der skal nok være nogen som spørger hvorfor filerne skal gemmes i databasen. det skal de bare ;)
Her er et eksempel som gemmer en JPG fil i en SQLServer database:
using System; using System.IO; using System.Data; using System.Data.SqlClient;
class MainClass { public static void Main(string[] args) { // connect SqlConnection con = new SqlConnection("server=ARNEPC2\\ARNEPC2RUN;Integrated Security=SSPI;database=TestMSDE"); con.Open();
// create table SqlCommand cre = new SqlCommand("CREATE TABLE imgtest (id INTEGER PRIMARY KEY,img IMAGE)", con); cre.ExecuteNonQuery();
// file -> byte array Stream imgfile = new FileStream(@"C:\blue.jpg", FileMode.Open); byte[] imgdata = new byte[(int)imgfile.Length]; imgfile.Read(imgdata, 0, imgdata.Length); imgfile.Close();
// insert SqlCommand ins = new SqlCommand("INSERT INTO imgtest VALUES(@id,@img)", con); ins.Parameters.Add("@id", SqlDbType.Int); ins.Parameters.Add("@img", SqlDbType.Image); ins.Parameters["@id"].Value = 1; ins.Parameters["@img"].Value = imgdata; ins.ExecuteNonQuery();
// select SqlCommand sel = new SqlCommand("SELECT img FROM imgtest WHERE id = @id", con); sel.Parameters.Add("@id", SqlDbType.Int); sel.Parameters["@id"].Value = 1; byte[] imgdata2 = (byte[])sel.ExecuteScalar();
// drop table SqlCommand drp = new SqlCommand("DROP TABLE imgtest", con); drp.ExecuteNonQuery();
Hvad nu hvis jeg gerne vil have såen at jeg får en liste over de de filer der ligger i databasen (har et felt der hedder navn så det er ikke svært at få listen). så skal der være en mulighed for at vælge "download" eller "Se". det vil sige at hvis man vælger "Se" skal filen ikke laves. den skal bare vises i browseren. og hvis man vælger "Download" så skal filen sendes til brugeren. kan det lade sig gøre?
sagtens.. hvis du kigger på arnes eksempel, har han til sidst et byte array -> file.. når man gemmer til en fil gemmer man ned i en Stream, og dette kan lige så godt være den stream som findes mellem browseren og webserveren:
men samtidig er der et problem med pdf-filen. den bliver vist som den skal (i nyt vindue) men resten af siden kommer til at "hænge". intet på siden bliver vist efter pdf-filen vises. heller ikke når man lukker det vindue. hvordan undgår man det?
nopes bruger ikke frames. det er bare en alm. asp.net side...
og med hensyn til det link du skrev: <a href="hent.aspx?id=123">minfil.doc</a> så findes der jo ikke nogen fil. ved ikke om jeg har forklaret mig godt nok så nu prøver jeg lige igen. jeg vil gerne have 2 links på siden. 1) Se (åbner "filen" - som ikke er en fil jo - i browseren). 2) Download (popper op og spørger om man vil downloade "filen"). Begge dele helt uden at den skal oprette filen på serveren.
okay. nu dropper jeg lige det der med at se filen i browseren. så det der nu skal laves er at jeg gerne vil have et "Download" punkt hvor man enten kan klikke på eller højreklikke og vælge "gem som".
undskyld, men jeg forstår ikke helt det med hent.aspx... jeg har min WebForm1.aspx som "Download"-linket også linker til. det er den eneste side jeg har.
okay. nu har jeg lavet en webform2.aspx. kan jeg få dig til at lave et eksempel på det der skal være på den nye side. er slet ikke inde i såen noget fil-noget her desværre :(
hmmm. det gir det samme resultat. åbner nyt vindue med pdf'en og så hænger den asp-side som har metoden... metoden ser efterhånden såen her ud:
Private Sub VisFil() mySqlConnection = New SqlConnection(Application("objc")) mySqlConnection.Open() mySqlCommand = New SqlCommand("SELECT billede FROM billede WHERE id = 2", mySqlConnection) Dim filedata2 As Byte() = mySqlCommand.ExecuteScalar()
Response.ContentType = "application/octet-stream" Response.BinaryWrite(filedata2) End Sub
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.