DredMedlem sedan okt. 20057 inlägg Jag ska skicka 2 parametrar och en zip-fil mot en server från min sida. Mottagande server kräver av mig parametrarna "username" och "password" med sina respektive värden och en zip-fil. Jag har gjort enligt nedanstående för att försöka skicka parametrarna först (utan filen till att börja med) men mottagande server hittar inte dessa. Vad gör jag för fel? och när det är löst, hur skickar jag zip-filen i samma request? Jag vet att parametrarna går att skicka i headern men det vill jag inte göra eftersom zip-filen också ska skickas och då är det lika bra att skicka allt i bodyn.
theBoundary = "-----my.Very.Unique.boundary-----"
Set xh=CreateObject("MSXML2.ServerXMLHTTP")
theUrl = "https://www.myserver.com/myservice.php"
theBody = ""
theBody = theBody & theBoundary
theBody = theBody & "Content-Disposition: form-data; name=""username"";" + vbCrLf + vbCrLf
theBody = theBody & "myusername"
theBody = theBody & theBoundary
theBody = theBody & "Content-Disposition: form-data; name=""password"";" + vbCrLf + vbCrLf
theBody = theBody & "mypass"
theBody = theBody & theBoundary
theBody = Server.urlencode(theBody)
xh.open "POST", theUrl, False
xh.setRequestHeader "Content-Type", "multipart/form-data; boundary=" + theBoundary
xh.send(theBody)
Response.write(xh.responseText)
Set xh = Nothing
Mycket tacksam för hjälp!
Ett tips är att använda ett program typ HttpWatch för att se hur filer skickas tillsammans med annan data vid vanliga uppladdningar. Eftersom du verkar ha ganska bra koll så borde du kunna kopiera hur webbläsaren skickar datat.
En sak jag funderar lite på när jag ser din kod är att du URLEncodat bodyn du skickar. Ska man verkligen göra det när man skickar fildata? Vid en vanlig POST så gör man ju det, men vid filuppladdning?
Jag hoppas i alla fall inte det, blir ganska mycket mer data att skicka då. :)
emissionMedlem sedan dec. 19996 721 inlägg Nej, man ska inte URL-encoda (vid en vanlig post är Content-Type= application/x-www-form-urlencoded). Filen skickar du på samma sätt som form-elementen, men kompletterar med attributen "filename" och "Content-Type", och därefter själva fildatat som en ström av bytes (ADODB.Stream-klassen kan tänkas vara användbar).
DredMedlem sedan okt. 20057 inlägg Ok, urlencodningen lade jag till egentligen i desperation. Men om jag ska skicka båda parametrarna och filen i samma request, behöver jag då inte ha en Content-Type som är multipart/form-data? Om du kan modifiera min kod ovan så vore jag oerhört tacksam.
emissionMedlem sedan dec. 19996 721 inlägg Här finns ett exempel
http://www.pstruh.cz/tips/detpg_uploadvbsie/
Det är förvisso klient-baserat, men principerna finns där...
emission: Den visar ju bara hur filer laddas upp. Inte hur vanlig data skickas.
Borde man inte kunna skriva ungefär så här...
theBody = _
theBoundary & vbCrLf & _
"Content-Disposition: form-data; name=""username""" & vbCrLf & _
vbCrLf & _
"myusername" & vbCrLf & _
theBoundary & vbCrLf & _
"Content-Disposition: form-data; name=""password""" & vbCrLf & _
vbCrLf & _
"mypass" & vbCrLf & _
theBoundary & vbCrLf & _
"Content-Disposition: form-data; name=""thefile""; filename=""C:\fil.zip""" & vbCrLf & _
"Content-Type: application/x-zip-compressed" & vbCrLf & _
vbCrLf & _
"fildatat" & vbCrLf & _
theBoundary & vbCrLf
Sen får man väl göra det på något snyggare sätt än att bara konkatenera en massa när man har stora filer man ska skicka...
DredMedlem sedan okt. 20057 inlägg Ok, men om vi struntar i filen ett tag och försöker bara få formdatat (user och pass) att komma in rätt i bodyn. Menar ni att bodyn är rätt formatterad? Misstänker att den inte är det eftersom mottagande server inte ser någon formdata alls. Är det också ok att jag använder multipart/form-data som Content-Type? En annan märklig grej som jag upptäckte också är att när jag kör Ethereal och analyserar requesten så ser jag att det blir en GET ocn inte en POST! Hur kommer det sig?!
Din body såg hyfsat rätt formaterad, men det var nåt semikolon för mycket och saknades lite radbrytningar.
Kolla på det jag skrivit ihop.
Att det blir en GET verkar mycket konstigt. Vad är Ethereal för något?
emissionMedlem sedan dec. 19996 721 inlägg
Erik Juhlin skrev:
Vad är Ethereal för något?
Ett suveränt paketanalysprogram, typ HttpWatch. Rekommenderas varmt.
DredMedlem sedan okt. 20057 inlägg Jag har testat igen med föreslagen kod, men det funkar i alla fall inte (mottagande server får ingen formdata). Och tittar jag i ethereal så ser jag att requesten skickas som GET, mottagande server säger att den får en POST. Fattar ingenting!
Jag gissar att det är Ethreal som har fel. Men att servern som tar emot inte får någonting verkar konstigt...
DredMedlem sedan okt. 20057 inlägg Ethereal hade inte fel, det var fel på min hjärna, jag sniffade nätet från fel maskin. Hur som helst, POSTen skickas helt ok, men mottagande server får alltså inga formparametrar. Så felet måste ändå ligga i hur jag formatterar requesten. Såhär ser koden ut just nu:
theBoundary = "---------------mbition.com.boundary"
set xh=createobject("MSXML2.ServerXMLHTTP")
theUrl = "http://www.myserver.com/test.php"
theBody = _
theBoundary & vbCrLf & _
"Content-Disposition: form-data; name=""username""" & vbCrLf & _
vbCrLf & _
"myusername" & vbCrLf & _
theBoundary & vbCrLf & _
"Content-Disposition: form-data; name=""password""" & vbCrLf & _
vbCrLf & _
"mypass" & vbCrLf & _
theBoundary & vbCrLf & "--"
xh.open "POST", theUrl, false
xh.setRequestHeader "Content-Type", "multipart/form-data; boundary=" + theBoundary
xh.send(theBody)
response.write(xh.responseText)
set xh = Nothing
Skriver jag ut theBody får jag följande:
---------------mbition.com.boundary Content-Disposition: form-data; name="username" myusername ---------------mbition.com.boundary Content-Disposition: form-data; name="password" mypass ---------------mbition.com.boundary --
Kan någon se något konstigt?
Inga radbrytningar? Men jag antar att det är för att du skriver ut det på en HTML-sida.
Ta View Source och kopiera därifrån så man kan se radbrytningarna också.
DredMedlem sedan okt. 20057 inlägg Såhär ser det ut när man tar view source:
---------------mbition.com.boundary
Content-Disposition: form-data; name="username"
myusername
---------------mbition.com.boundary
Content-Disposition: form-data; name="password"
mypass
---------------mbition.com.boundary
--
DredMedlem sedan okt. 20057 inlägg Kunde någon se något konstigt med bodyn ovan?