FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Flitig postare
|
Tja!
Jag har lite problem med en sak jag försöker få igång. Jag vill kunna ladda upp filer till en webserver. Men det krävs lite säkerhet så jag vill lägga in filerna i en SQL 2000 Server Databas. Sen när man laddar ner filerna så ska de skapas från databasen och läggas i en temp mapp. När filen är färdigtankad så tas den bort. Men jag får det inte riktigt att fungera som jag vill. Så här ser min nuvarande kod ut. Jag skriver i ASP 3.0 vbScript. Tack på förhand... '********************************************** '* Ladda in en fil '********************************************** If Request.QueryString("action") = "upload" then Response.Expires=0 Dim UploadRequest, byteCount, RequestBin, PosBeg, i, char, PosEnd, boundary, boundaryPos, Pos, intCount Dim Name, PosFile, value, filename, contentType, filepathname, PosBound, MyFile, ScriptObject, DBFil byteCount = Request.TotalBytes RequestBin = Request.BinaryRead(byteCount) Set UploadRequest = CreateObject("Scripting.Dictionary") BuildUploadRequest RequestBin contentType = UploadRequest.Item("file1").Item("ContentType") filepathname = UploadRequest.Item("file1").Item("FileName") filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\")) value = UploadRequest.Item("file1").Item("Value") Response.Write UploadRequest.Item("file1").Item("Value") 'Lägg in skiten i databasen Dim rsFil Set rsFil = objConn.Execute("INSERT INTO Inv_Lic_Fil (Inv_Lic_Fil_ByteCount,Inv_Lic_Fil_ContentType,Inv _Lic_Fil_FilePath,Inv_Lic_Fil_FileName,Inv_Lic_Fil _Licens,Inv_Lic_Fil_Datum) VALUES (" & byteCount & ",'" & contentType & "','" & filepathname & "','" & filename & "','" & idLicens & "','" & Date() & "') SELECT @@IDENTITY").NextRecordSet 'Set rsFil = objConn.Execute("INSERT INTO Inv_Lic_Fil (Inv_Lic_Fil_ByteCount,Inv_Lic_Fil_FilePath,Inv_Li c_Fil_FileName,Inv_Lic_Fil_Licens,Inv_Lic_Fil_Datu m) VALUES (" & byteCount & ",'" & filepathname & "','" & filename & "','" & idLicens & "','" & Date() & "') SELECT @@IDENTITY").NextRecordSet Response.Write " Byte Count:" & byteCount Response.Write " Content Type:" & contentType Response.Write " File Path Name:" & filepathname Response.Write " File Name:" & filename Response.Write " Value:" & value 'Response.Redirect("inventering_licens_filer.asp?i d=" & idLicens & "&print=no") End if '********************************************** '* Bygg en fil '********************************************** 'If Request.QueryString("action") = "ladda" then Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject") Set MyFile = ScriptObject.CreateTextFile("C:\_Websidor\_WebOffi ce\_Utveckling\_Licenser\" & filename) For i = 1 to LenB(value) 'MyFile.Write chr(AscB(MidB(value,i,1))) 'objConn.Execute("UPDATE Inv_Lic_Fil SET Inv_Lic_Fil_Value = Inv_Lic_Fil_Value & '" & chr(AscB(MidB(value,i,1))) & "' WHERE Inv_Lic_Fil_Id = '" & rsFil(0) & "'") Response.Write chr(AscB(MidB(value,i,1))) Next MyFile.Close set myfile = nothing 'End if '********************************************** '* Fil functioner '********************************************** Sub BuildUploadRequest(RequestBin) PosBeg = 1 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13))) boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg) boundaryPos = InstrB(1,RequestBin,boundary) Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--"))) Dim UploadControl Set UploadControl = CreateObject("Scripting.Dictionary") Pos = InstrB(BoundaryPos,RequestBin,getByteString("Conte nt-Disposition")) Pos = InstrB(Pos,RequestBin,getByteString("name=")) PosBeg = Pos+6 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34))) Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filen ame=")) PosBound = InstrB(PosEnd,RequestBin,boundary) If PosFile<>0 AND (PosFile<PosBound) Then PosBeg = PosFile + 10 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34))) FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) UploadControl.Add "FileName", FileName Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:")) PosBeg = Pos+14 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13))) ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) UploadControl.Add "ContentType",ContentType PosBeg = PosEnd+4 PosEnd = InstrB(PosBeg,RequestBin,boundary)-2 Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg) Else Pos = InstrB(Pos,RequestBin,getByteString(chr(13))) PosBeg = Pos+4 PosEnd = InstrB(PosBeg,RequestBin,boundary)-2 Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) End If UploadControl.Add "Value" , Value UploadRequest.Add name, UploadControl BoundaryPos=InstrB(BoundaryPos+LenB(boundary),Requ estBin,boundary) Loop End Sub Function getByteString(StringStr) For i = 1 to Len(StringStr) char = Mid(StringStr,i,1) getByteString = getByteString & chrB(AscB(char)) Next End Function Function getString(StringBin) getString ="" For intCount = 1 to LenB(StringBin) getString = getString & chr(AscB(MidB(StringBin,intCount,1))) Next End Function |
|||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Bara ett inlägg till!
|
Varför lägga den som en tempfil innan den skickas iväg till klienten? Ett onödigt steg som bara gör en onödig delay för klienten och lastar ner HDD.
|
|||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Flitig postare
|
Jo, jag kom på det...
Men problemet är inte det. Det är hur man får in filen i databasen... |
|||
![]() |
![]() |
![]() |
#4 | |||
|
||||
Klarade millennium-buggen
|
Får in filen i databasen? Är det optimalt att göra det? Har kört blob som datatyp för många år sedan men har aldrig sett många som gör så.
Om du med säkerhet menar att folk inte ska kunna "surfa fram" bilderna kan du ju ta och döpa om dom till en lång hashkod och endast spara det nya filnamnet i databasen. Men om du verkligen vill göra som du har tänkt så vette tusan. Inget vanligt scenario direkt... |
|||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Jag kanske inte är den mest erfarna i databaser, har endast använd de till enklare sidor. Dock har jag läst en del och även från ett förnuftigt resonemang måste jag avråda dig att spara bilder i databasen. Det slöar upp en hel del och om det är bilder vi talar om, så kommer dessa att laddas mycket längre tid är fran hårddisken. Gör som ovan nämndes; döp om filen och spara, spara i en mapp och spara namnet i databasen.
/M |
||
![]() |
![]() |
![]() |
#6 | |||
|
||||
Flitig postare
|
Det hanlar om filer, och anledningen till att jag inte döper till krångliga namn är att jag vill ha en komplett backup av filer när man kör en Databas backup.
Prestandan är inte några som hällst problem. Skulle kunna köra en oändlig loop utan att det skulle slöa ner. (nästan ![]() [EDIT] Dessutom är det inte säkert att döpa filer och lägga in dem i konstiga mappnamn. |
|||
![]() |
![]() |
![]() |
#7 | ||
|
|||
Hej, jag är ny här.
|
Vad sägs om att du lägger filerna i en privat mapp på en annan plats på hdd:n med ett id-nummer som du sedan sparar i db:n så du kan hitta dem igen och sedananvänder en download-funktion för att tanka ner dem till kunden. Det är ju bara att göra en asp-sida som byter ut Contenttype till det som är lämpligt...har en aspx sida som gör det...det sur ungefär så här...
Response.Clear(); Response.ContentType = "application/octet-stream"; Response.AddHeader("Content-Disposition", "attachment; filename=\"" + Filename + "\"") ; Response.Flush(); Response.WriteFile(ConfigurationSettings.AppSettin gs["fileLocation"]+path+"\"+Filename); Response.End(); Funkar bra för min del men kanske inte för dej. Om du har några frågor så är det bara att ställa dem... |
||
![]() |
![]() |
Svara |
|
|