webForumDet fria alternativet

Submit med både text och bilduppladdning

ASP

6 svar · 312 visningar · startad av OveRRidE

Medlem sedan feb. 200112 078 inlägg
Frågan#1

Jag vill kunna ladda upp en bild samtidigt som jag sparar information från ett formulär i min databas, alltså i samma händelse.

Problemet är att om jag använder samma mottagar-sida, så kan jag inte request:a varken querystrings eller forms eftersom binary-read inte tillåter det på samma sida.

Hur skall jag göra om min besökare vill fylla i massor med info i vanliga forms och på samma sida välja en bild med <input type="file"> och när sedan formuläret skickas, skall allt sparas, fil på servern, formulärdatan i db:n.

:q

Kod för uppladdningen av filen (komponentlösa script-filer)

outputfile.asp

Response.Expires = 0
Response.Buffer = TRUE
Response.Clear
'Response.BinaryWrite(Request.BinaryRead(Request.TotalBytes))
byteCount = Request.TotalBytes
'Response.BinaryWrite(Request.BinaryRead(varByteCount))

RequestBin = Request.BinaryRead(byteCount)
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")

BuildUploadRequest RequestBin

'email = UploadRequest.Item("email").Item("Value")

contentType = UploadRequest.Item("blob").Item("ContentType")
filepathname = UploadRequest.Item("blob").Item("FileName")
filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
value = UploadRequest.Item("blob").Item("Value")

'response.write filename
'response.end

'Create FileSytemObject Component
Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")

'Create and Write to a File
pathEnd = Len(Server.mappath(Request.ServerVariables("PATH_INFO")))-14
' Set MyFile = ScriptObject.CreateTextFile(Left(Server.mappath(Request.ServerVariables("PATH_INFO")),pathEnd)&filename)
Set MyFile = ScriptObject.CreateTextFile(Server.mappath("/gfx/bilder/"&filename))
response.write(Server.mappath(filename)) 

For i = 1 to LenB(value)
MyFile.Write chr(AscB(MidB(value,i,1)))
Next

MyFile.Close
%>
<!--#include file="upload.asp"-->
<%
response.redirect "reg_file.asp?id=" & request.querystring("id") & "&file=" & fileName

upload.asp

Sub BuildUploadRequest(RequestBin)
'Get the boundary
PosBeg = 1
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
boundaryPos = InstrB(1,RequestBin,boundary)
'Get all data inside the boundaries
Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--")))
'Members variable of objects are put in a dictionary object
Dim UploadControl
Set UploadControl = CreateObject("Scripting.Dictionary")
'Get an object name
Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-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("filename="))
PosBound = InstrB(PosEnd,RequestBin,boundary)
'Test if object is of file type
If PosFile<>0 AND (PosFile<PosBound) Then
'Get Filename, content-type and content of file
PosBeg = PosFile + 10
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34)))
FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
'Add filename to dictionary object
UploadControl.Add "FileName", FileName
Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:"))
PosBeg = Pos+14
PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
'Add content-type to dictionary object
ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg))
UploadControl.Add "ContentType",ContentType
'Get content of object
PosBeg = PosEnd+4
PosEnd = InstrB(PosBeg,RequestBin,boundary)-2
Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg)
Else
'Get content of object
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
'Add content to dictionary object
UploadControl.Add "Value" , Value 
'Add dictionary object to main dictionary
UploadRequest.Add name, UploadControl 
'Loop to next object
BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary)
Loop

End Sub

'String to byte string conversion
Function getByteString(StringStr)
For i = 1 to Len(StringStr)
char = Mid(StringStr,i,1)
getByteString = getByteString & chrB(AscB(char))
Next
End Function

'Byte string to string conversion
Function getString(StringBin)
getString =""
For intCount = 1 to LenB(StringBin)
getString = getString & chr(AscB(MidB(StringBin,intCount,1))) 
Next
End Function

:q :l

Medlem sedan feb. 20001 590 inlägg
#2

Du får använda:
variabel=UploadRequest.Item("formulärfältnamn").Item("Value")

och sedan stoppa in variabeln i ett fält.

/T

Medlem sedan feb. 200112 078 inlägg
#3
variabel=UploadRequest.Item("formulärfältnamn").Item([b]"Value"[/b])

Skall det verkligen vara fnuttar runt Value? Är inte det ett variabelnamn?

Medlem sedan jan. 200284 inlägg
#4

Såhär löste jag det

Här laddar jag upp en bild och lägger in bildnamnet i namnkollumnen genom ett textformulär jag döpt till "namn"

Sen laddar jag upp bilden i "test" katalogen och filnamnet läggs in i databasen så bilden läggs ut automatiskt genom
<%=blob%>

[kod]

<%
Response.Expires=0
Response.Buffer = TRUE
Response.Clear
'Response.BinaryWrite(Request.BinaryRead(Request.TotalBytes))
byteCount = Request.TotalBytes
'Response.BinaryWrite(Request.BinaryRead(varByteCount))

RequestBin = Request.BinaryRead(byteCount)
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")

BuildUploadRequest RequestBin

contentType = UploadRequest.Item("blob").Item("ContentType")
filepathname = UploadRequest.Item("blob").Item("FileName")
filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
value = UploadRequest.Item("blob").Item("Value")

namn = UploadRequest.Item("namn").Item("Value")

'Ta emot

set Conn=server.createobject("adodb.connection")
path="DBQ=" & server.mappath("db_upload.mdb")
conn.open "driver={microsoft access driver (*.mdb)}; " & path," ",""
SQL = "Select * from pages"
set Rs = Server.CreateObject("ADODB.Recordset")
Rs.Open sql, conn, 3, 3

		Rs.Addnew
            
    RS("namn") = namn


    RS("blob") = "test/" & filename
    Rs.Update

	Rs.close
    Conn.close

'Create FileSytemObject Component
Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")

'Create and Write to a File
pathEnd = Len(Server.mappath(Request.ServerVariables("PATH_INFO")))-14
' Set MyFile = ScriptObject.CreateTextFile(Left(Server.mappath(Request.ServerVariables("PATH_INFO")),pathEnd)&filename)
Set MyFile = ScriptObject.CreateTextFile(Server.mappath("test/"&filename))

For i = 1 to LenB(value)
MyFile.Write chr(AscB(MidB(value,i,1)))
Next

MyFile.Close
%> <b><FONT SIZE="2" FACE="Verdana, Arial, Helvetica, sans-serif">Filen du laddade
upp</FONT>: </b><%=filename%><BR> <!--#include file="upload.asp"-->

Medlem sedan mars 20025 907 inlägg
#5

"komponentlösa script-filer".....innebär det att man kan ladda upp filer på servern även om den inte har asp-upload?? Kanske är en lite dum fråga, men vad vet jag?

Medlem sedan jan. 200284 inlägg
#6

Japp.

Precis.
Det krävs ingen komponent för att ladda upp filer.

Medlem sedan feb. 200112 078 inlägg
#7

Jepp. Jag fick det att fungera. Tack! :)

272 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
130 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
130 ms — ändringar (db)