Terve!
Nyt olisi aikomuksena lähettää PHP- skriptille tiedosto VB.NET:illä (VB2010) POST- datassa. Olen kokeillut muutamia juttuja mitä löysin Googlella, mutta mikään ei näytä toimivan.
Skriptin pitäisi vain yksinkertaisesti vastaanottaa tiedosto, mutta se väittää että se ei saanut tiedostoa.
Skripti on kaverin palvelimella, joten en sitä tähän voi laittaa.
Kysykää, jos haluatte lisätietoa.
Apua?
:O
MORJENS gamehouse!
kokeile mitä tapahtuu kun postaat oheisen esimerkin mukaisella viritelmällä...
'(väännety SharpDevelop 4.0:lla) Imports System.IO Imports System.Net Public Partial Class MainForm Public Sub New() Me.InitializeComponent() End Sub Sub Button1_Click(sender As Object, e As EventArgs) Dim URL As String = "http://kaverinpalvelin/phpscripti.php" Dim request As HttpWebRequest = _ CType(WebRequest.Create(URL), HttpWebRequest) Dim MyCookies As New CookieContainer Dim MyCookie As New Cookie MyCookie.Name = "filename" MyCookie.Value = "testi.txt" MyCookies.Add(New Uri(URL), MyCookie) request.UserAgent = _ "Mozilla/5.0 (Windows; U; Windows NT 5.1; fi; rv:1.9.0.5) " & _ "Gecko/2008120122 Firefox/3.0.5 (.NET CLR 3.5.30729)" request.CookieContainer = MyCookies request.Method = "POST" request.AllowAutoRedirect = False request.ContentType = "application/x-www-form-urlencoded" Dim buffer(1024) As Byte Dim requestStream As Stream = request.GetRequestStream() Dim fileStream As Stream = File.OpenRead("C:\testi.txt") Dim read As Integer = fileStream.Read(buffer, 0, buffer.Length) while(read > 0) requestStream.Write(buffer,0,read) read = fileStream.Read(buffer, 0, buffer.Length) End While requestStream.Close() fileStream.Close Dim response As HttpWebResponse = _ CType(request.GetResponse(), HttpWebResponse) Response.Close() MsgBox(response.StatusCode.ToString) End Sub End Class
Kiitos neau33!
Vielä sellainen kysymys, että miten saan palvelimen vastauksen tekstinä?
Kun se PHP- skripti antaa vastaukseksi esim. "&&10" ja vastauksen näkeminen olisi tärkeää.
EDIT:
Tosiaan kaikki kokeilemani VB- koodit eivät ole onnistuneet lähettämään tiedostoa. Skripti vastaa, mutta sanoo tallennuksen epäonnistuneen. HTML- formilla tallennus onnistuu. Formin koodi:
<form enctype="multipart/form-data" action="laheta.php?kayttaja=heihei" method="POST"> Valitse: <input name="tallennus" type="file" /><br /> <input type="submit" value="Lähetä" /> </form>
Tuo html-formi lähettää enkoodaustyypillä multipart/form-data joka on ainoa, jolla voi lähettää tiedostoja ihan tiedostoina http:llä. (Eli niin että näkyvät PHP:n $FILES_taulukossa). Nean esimerkki taas käyttää application/x-www-form-urlencoded koodausta.
Itseltäni löytyy kyllä koodi, jolla lähetän multipart/form-datana tiedostoja ja muita kenttiä, mutta se on spesifiseen tarkoitukseen tehty ja silti pari sivua pitkä koodi, enkä jaksa nyt alkaa sitä muokkaamaan yleiseen muotoon. Netistä löytynee valmiita esimerkkejä, ja voihan se nykyframeworkeissa olla suoraan tuettunakin.
Vastauksen saamisesta stringiin kirjiotin juuri esimerkin tuolla:
https://www.ohjelmointiputka.net/keskustelu/
POST palvelin/laheta.php?kayttaja=heihei HTTP/1.0 Host: osoite.com Content-Type: multipart/form-data, boundary=VTBcUDK0zeE9FBD3UYJofLWvTBNpsG8m Content-Length: 44768 --VTBcUDK0zeE9FBD3UYJofLWvTBNpsG8m Content-Disposition: form-data; name="tiedosto"; filename="android_logo.jpg" Content-Type: multipart/form-data ÿØÿà
Tuollainen pyyntö lähtee koneelta palvelimelle päin mutta tallennus epäonnistuu, koska PHP- skripti ei löydä tiedostoa POSTista.. Missä vika?
Siis eihän sen $_POST -taulukosta pitäisi löytyäkään vaan $_FILES -taulukosta
https://www.php.net/manual/en/features.file-upload.post-method.php
Mutta ei sen puoleen, nopealla vilkaisulla tuosta pyynnöstäkin puuttuu loppuosa. Eli lopussa pitäisi olla vielä
--VTBcUDK0zeE9FBD3UYJofLWvTBNpsG8m--
Tosin taitaa koko pyyntö olla vajaa, koska tuon pituus ei mitenkään ole 44 kiloa.
Jälkimmäinen Content-Type kertoo tiedoston tyypin, ja siihen järkevämpi valinta olisi vaikka application/octet-stream. En kokeillut, mutta jotenkin tuntuu, että multipart/form-data saattaisi siinä jopa rikkoa jotain. Lisäksi tiedoston loppumisen merkkinä pitäisi olla --boundary--.
Kun lähetän tiedoston, jossa lukee "abc" (kolme tavua, ei rivinvaihtoa), HTML-formilta lähtee seuraavaa. Katso tästä, mitä rivinvaihtoja ja boundaryita pyyntöön kuuluu.
POST /koe?x=y HTTP/1.1 Host: localhost:8080 Content-Length: 120 Content-Type: multipart/form-data; boundary=ABCD --ABCD Content-Disposition: form-data; name="tiedosto"; filename="koe.txt" Content-Type: text/plain abc --ABCD--
Ja eihän se tiedosto PHP:llä $_POST-taulukkoon tule vaan $_FILES-taulukkoon.
MORJENS taas gamehouse!
oheisen mallin mukaisen viritelmän pitäisi toimia
'VB.NET-koodi (väännetty SharpDevelop 4.0:lla) Imports System.IO Imports System.Net Imports System.Web Imports System.Collections.Specialized Imports System.Text Public Partial Class MainForm Public Sub New() Me.InitializeComponent() End Sub Sub Button1_Click(sender As Object, e As EventArgs) Dim cookies As CookieContainer = new CookieContainer() Dim querystring As NameValueCollection = _ New NameValueCollection() querystring("user")="käyttäjä" querystring("pwd")="salasana" Dim uploadfile As String = "c:\kuva.jpg" MsgBox(UploadFileEx(uploadfile, _ "http://localhost/postfile_test/upload.php", _ "uploadfile", "image/pjpeg", querystring, cookies)) End Sub Public Shared Function UploadFileEx( _ uploadfile As String, url As String, _ fileFormName As String, contenttype As String, _ querystring As NameValueCollection, _ cookies As CookieContainer) As String If (fileFormName Is Nothing) OrElse _ (fileFormName.Length = 0) Then fileFormName = "file" End If If (contenttype Is Nothing) OrElse _ (contenttype.Length = 0) Then contenttype = "application/octet-stream" End If Dim postdata As String postdata = "?" If querystring IsNot Nothing Then For Each key As String In querystring.Keys postdata += key & "=" & querystring.[Get](key) & "&" Next End If Dim uri As New Uri(url & postdata) Dim boundary As String = "----------" & _ DateTime.Now.Ticks.ToString("x") Dim webrequest__1 As HttpWebRequest = _ DirectCast(WebRequest.Create(uri), HttpWebRequest) webrequest__1.CookieContainer = cookies webrequest__1.ContentType = _ "multipart/form-data; boundary=" & boundary webrequest__1.Method = "POST" Dim sb As New StringBuilder() sb.Append("--") sb.Append(boundary) sb.Append(vbCr & vbLf) sb.Append("Content-Disposition: form-data; name=""") sb.Append("userfile") sb.Append("""; filename=""") sb.Append(Path.GetFileName(uploadfile)) sb.Append("""") sb.Append(vbCr & vbLf) sb.Append("Content-Type: ") sb.Append(contenttype) sb.Append(vbCr & vbLf) sb.Append(vbCr & vbLf) Dim postHeader As String = sb.ToString() Dim postHeaderBytes As Byte() = _ Encoding.UTF8.GetBytes(postHeader) Dim boundaryBytes As Byte() = _ Encoding.ASCII.GetBytes(vbCr & vbLf & _ "--" & boundary & vbCr & vbLf) Dim fileStream As New FileStream(uploadfile, _ FileMode.Open, FileAccess.Read) Dim length As Long = postHeaderBytes.Length + _ fileStream.Length + boundaryBytes.Length webrequest__1.ContentLength = length Dim requestStream As Stream = _ webrequest__1.GetRequestStream() requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length) Dim buffer As Byte() = New [Byte] (Ctype(CUInt(Math.Min( _ 4096, CInt(fileStream.Length))) - 1,Integer)) {} Dim bytesRead As Integer = 0 While (InlineAssignHelper(bytesRead, _ fileStream.Read(buffer, 0, buffer.Length))) <> 0 requestStream.Write(buffer, 0, bytesRead) End While requestStream.Write(boundaryBytes, 0, boundaryBytes.Length) Dim responce As WebResponse = webrequest__1.GetResponse() Dim s As Stream = responce.GetResponseStream() Dim sr As New StreamReader(s) Return sr.ReadToEnd() End Function Private Shared Function InlineAssignHelper(Of T)( _ ByRef target As T, value As T) As T target = value Return value End Function End Class
<?php //PHP-koodi (upload.php) print_r($_REQUEST); $uploadDir = "uploads/"; $uploadFile = $uploadDir.$_FILES['userfile']['name']; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadFile)) { setcookie("Uploadprocess", "File was successfully uploaded."); } else { print "Upload error!\n Debug info:\n"; print_r($_FILES); } ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.