Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: [VB.NET] Tiedoston lähetys PHPlle POSTilla

Sivun loppuun

gamehouse [31.03.2011 22:28:31]

#

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

neau33 [02.04.2011 00:30:18]

#

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

gamehouse [02.04.2011 16:50:48]

#

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>

Grez [02.04.2011 17:42:35]

#

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/22380-vb-net-nopea-tiedon-siirto

gamehouse [02.04.2011 18:23:53]

#

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?

Grez [02.04.2011 18:31:19]

#

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.

Metabolix [02.04.2011 18:43:02]

#

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.

neau33 [04.04.2011 02:45:36]

#

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);
   }

?>

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta