Avatar billede frigsfrogs Nybegynder
17. februar 2005 - 13:44 Der 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 ;)

håber nogen kan hjælpe.

Mvh. Carsten
Avatar billede arne_v Ekspert
17. februar 2005 - 14:04 #1
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();
       
        // byte array -> file
        Stream imgfile2 = new FileStream(@"C:\blue2.jpg", FileMode.Create);
        imgfile2.Write(imgdata2, 0, imgdata2.Length);
        imgfile2.Close();

        // disconnect
        con.Close();
    }
}
Avatar billede arne_v Ekspert
17. februar 2005 - 14:04 #2
Du kan behandle PDF og DOC helt på samme måde (binære filer er binære filer).
Avatar billede frigsfrogs Nybegynder
17. februar 2005 - 15:09 #3
Helt kanon mand! det funger bare perfekt.

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?

læg lige et svar så får du dine point...
Avatar billede arne_v Ekspert
17. februar 2005 - 15:15 #4
Så skal du vel generere <A HREF="hent.aspx?id=123">minfil.doc</A> og have
en hent.aspx som returnerer filen
Avatar billede arne_v Ekspert
17. februar 2005 - 15:15 #5
og et svar
Avatar billede frigsfrogs Nybegynder
17. februar 2005 - 15:17 #6
okay den forstod jeg ikke lige den der. kan det lade sig gøre at vise/downloade filen uden at den bliver lavet som fil på serveren?
Avatar billede burningice Nybegynder
17. februar 2005 - 15:19 #7
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:

// byte array -> client
        Stream clientStream = Response.OutputStream;
        clientStream .Write(imgdata2, 0, imgdata2.Length);
Avatar billede frigsfrogs Nybegynder
17. februar 2005 - 15:36 #8
hmm kan få det til at virke med pdf men ikke med doc eller xls. der viser den bare alt det der stream-noget
Avatar billede frigsfrogs Nybegynder
17. februar 2005 - 15:40 #9
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?
Avatar billede arne_v Ekspert
17. februar 2005 - 16:12 #10
Med hensyn til andre fil typer:

Det må da bare være et spørgsmål om at sende den rette content type i hent.aspx !

Med hensyn til hang:

Bruger du frames eller sådan noget ?
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 08:21 #11
hey igen.

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.
Avatar billede arne_v Ekspert
18. februar 2005 - 08:28 #12
Det er jo hent.aspx som leverer "filen" om det er en rigtig fil eller ej er
helt usynligt for browseren.
Avatar billede arne_v Ekspert
18. februar 2005 - 08:28 #13
Hvis du ikke bruger frames hvordan kan:
  resten af siden kommer til at "hænge"
?
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 08:33 #14
Pdf-filen åbner i nyt vindue. og så hænger det originale vindue.
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 08:41 #15
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.
Avatar billede arne_v Ekspert
18. februar 2005 - 08:52 #16
hent.aspx er en ny side du skal lave som:
  - henter data
  - sætter content type application/octet-atream
  - skriver data binært til response
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 09:01 #17
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 :(
Avatar billede arne_v Ekspert
18. februar 2005 - 09:12 #18
Meget kort version:

<%@ Page Language="C#" %>
<%
byte[] data = ...;
Response.ContentType = "application/octet-stream";
Response.BinaryWrite(data);
%>
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 09:20 #19
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
Avatar billede arne_v Ekspert
18. februar 2005 - 09:33 #20
Hvor kommer en metode VisFil ind i billedet ?
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 09:55 #21
hehe. det er fordi jeg laver det her oppe i page_load:

if request.querystring("action") = "se" then visfil()
if request.querystring("action") = "download" then downloadfil()
Avatar billede frigsfrogs Nybegynder
18. februar 2005 - 19:54 #22
jeg fandt ud af det...
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