2016-05-25 10 views
0

Ich habe einen einfachen Knoten js Server/App, die Dateien empfangen. Ich habe versucht, JPEG-Dateien mit CURL Upload und funktioniert perfekt.Ich habe versucht mit postman funktioniert auch gut.Aber wenn ich versuche, JPEG mit einfachen Ruby-Skript über Tcp-Socket hochladen es funktioniert nicht.Die Anfrage wird vom Server aber mit erhalten Kein Dateiobjekt. In Node js Server route debugge ich die Anfrage wie so console.log(request.body); und dies gibt undefined zurück. Mit Curl und Postman erhalte ich ein richtiges Anfrageobjekt (Datei) .Dies scheint, als ob meine http-Anfrage im Ruby-Skript nicht richtig formatiert ist, Kann jemand darauf hinweisen, was mache ich hier falsch? Vielen Dank im Voraus.Hier ist mein Ruby-Skript .Wie formatiert man Http multipart/form-data-Anfrage zum Hochladen von Datei auf den Server

require 'socket' 

host = "127.0.0.1" 
port = 8080 

client = TCPSocket.open(host, port) 

client.write("POST /api/binary HTTP/1.1\r\n") 
client.write("Host: 127.0.0.1\r\n") 
client.write ("Accept: */* \r\n") 
client.write ("Content-Type: multipart/form-data; boundary=AaB03x\r\n") 
client.write ("\r\n") 
client.write("AaB03x"+ "\n" + "Content-Disposition: form-data; name='datafile'; filename='cam.jpg' \n Content-Type: image/jpeg \r\n") 

data = File.open("./dom.jpg", "rb") {|io| io.read} 
client.write (data) 
client.write("boundary=AaB03x\r\n") 
client.write ("\r\n") 
client.close 

generiert Codestück von Postbote

POST /api/binary HTTP/1.1 
Host: myapp.herokuapp.com 
Cache-Control: no-cache 
Postman-Token: c15a79a2-3a4b-0555-a876-9032afeab5de 
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW 

----WebKitFormBoundary7MA4YWxkTrZu0gW 
Content-Disposition: form-data; name=""; filename="" 
Content-Type: 


----WebKitFormBoundary7MA4YWxkTrZu0gW 
+0

Ihr Ruby-Code stellt eine Verbindung zu localhost her, aber die generierte HTTP-Anfrage scheint nicht zu stimmen. – Uzbekjon

+0

Der Postbote ist eine Verbindung zu meiner deployed App (remote server) .Ich habe eine Datei mit CURL an meinen localhost gesendet und es funktioniert einwandfrei. Das einzige Problem ist, wenn ich das Skript verwende, das ich erstellt habe, ob ich an localhost oder Remote-Server sende, bekomme ich 'undefined' Anfrageobjekt. – sparks

Antwort

0

ich nicht Content-Length: length Endfassung vorging, die funktioniert, ist dies ein.

require 'socket' 

host = "myapp.herokuapp.com" 
port = 80 

client = TCPSocket.open(host, port) 

client.write("POST /api/binary HTTP/1.1\r\n") 
client.write("Host: #{host}\r\n") 
client.write ("Accept: */*\r\n") 
client.write ("Content-Type: multipart/form-data; boundary=AaB03x\r\n") 

body = "--AaB03x\r\n" 
body << "Content-Disposition: form-data; name='datafile'; filename='cam.jpg'\r\n" 

body << "Content-Type: image/jpeg\r\n" 
body << "\r\n" 
data = File.open("./pic.jpg", "rb") {|io| io.read} 

body << data 
body << "\r\n" 

body << "--AaB03x--\r\n" 

client.print "Content-Length: #{body.bytesize}\r\n" 

client.print "\r\n" 

client.print body 

client.close