17. oktober 2001 - 23:52
#1
Du er sikkert ude efter at sende dokumentet ud til brugeren som et word-dokument. Ikke?
Det største problem ligger i at få fat i de rigtige binære data i filen, da et OLE objekt faktisk kan bestå af mange dele.
Men hvis vi nu går ud fra at det \"kun\" er en word-fil, så er det til at håndtere.
Så skal vi \"bare\" have fjernet OLE informationerne i starten af de binære data.
Headerens længde er ikke altid den samme, så vi er nødt til at kigge på hvor lang den er.
Første integer er Signaturen - 151C
Herefter kommer en integer der fortæller hvor lang headeren er, fx 2D00 = 45 byte.
Så har vi objekt typen(OT_STATIC, OT_LINKED, OT_EMBEDDED). Hvis den er 0100 0000, bør man faktisk stoppe, da filen så ligger eksternt.
Herefter kommer NameLen - længden af klassens navn = 0900, og ClassLen - længden af klassens navn fx 1000.
Herefter NameOffset og ClassOffset, som begge er integers.
For at finde selve filen skal vi bruge HeaderSize og ClassLen. Oven i dette lægger vi 24 byte.
I eksemplet ovenover bliver det:
45 (HeaderSize) + 16 (ClassLen) + 24 = 85.
Så læser man bare fra byte 85 og frem.
sqlStr= \"SELECT minfil FROM Testtabel\"
rsSet.Open sqlStr, dbConn
if not rsSet.EOF then
set adoStream=Server.CreateObject(\"ADODB.Stream\")
adoStream.Type = 1
adoStream.Open
adoStream.Position = 0
adoStream.Write rsSet.Fields(0).Value
adoStream.Position = 0
Header=adoStream.Read(20)
HeaderSize=ascB(MidB(Header,3,1))+256*ascB(MidB(Header,4,1))
ClassLen=ascB(MidB(Header,11,1))+256*ascB(MidB(Header,12,1))
adoStream.Position=HeaderSize+ClassLen+24
Response.BinaryWrite adoStream.Read
end if
rsSet.Close
set rsSet=Nothing
- Morten