Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Preoblem mit Dateiupload PHP>Delphi (https://www.delphipraxis.net/175787-preoblem-mit-dateiupload-php-delphi.html)

franktron 18. Jul 2013 09:01

Preoblem mit Dateiupload PHP>Delphi
 
Ich lade per PHP eine Datei zu meine Delphi Programm hoch (per IDHTTPServer)

Code:
function uploadplotterfile($mode,$id,$filename) {
   global $localpath;
   define('MULTIPART_BOUNDARY', '--------------------------'.microtime(true));
   $header = 'Content-Type: multipart/form-data; boundary='.MULTIPART_BOUNDARY;
   define('FORM_FIELD', 'uploaded_file');
   
   if (!is_file($localpath. '/' .$filename)) {
      echo 'Error ' . $localpath. '/' .$filename;
   }
   
   $file_contents = file_get_contents($localpath. '/' .$filename);  
   
   $content = "--".MULTIPART_BOUNDARY."\r\n".
                     "Content-Disposition: form-data; name=\"".FORM_FIELD."\"; filename=\"".basename($filename)."\"\r\n".
                     "Content-Type: application/pdf\r\n\r\n".
                     $file_contents."\r\n".
   
   /*// add some POST fields to the request too: $_POST['foo'] = 'bar'
   $content .= "--".MULTIPART_BOUNDARY."\r\n".
                     "Content-Disposition: form-data; name=\"foo\"\r\n\r\n".
                     "bar\r\n".*/
   
   // signal end of request (note the trailing "--")
   $content .= "--".MULTIPART_BOUNDARY."--\r\n";
   $context = stream_context_create(array(
      'http' => array(
      'method' => 'POST',
      'header' => $header,
      'content' => $content,
      ),
   ));
   file_get_contents('http://192.168.11.40:4999/plotter?mode=' . $mode . '&id=' . $id,false,$context);
}
Delphi-Quellcode:
procedure TPlotterWebMain.OnPost(Request: TIdHTTPRequestInfo;
  Response: TIdHTTPResponseInfo);
Var
  Stream : TFileStream;
  Decoder : TIdMessageDecoder;
  MsgEnd : Boolean;
  Boundary: String;
  Buffer : String;
begin
  inherited;
  If Request.Params.Count>1 then
  Begin
    If Request.Params.Strings[0]='mode=upload' then
    Begin
      Buffer:=Request.Params.Strings[1];
      Delete(Buffer,1,Pos('=',Buffer));
      MsgEnd:=False;
      Stream:=TFileStream.Create(Buffer+'.pdf',fmCreate);
      Decoder:=TIdMessageDecoderMIME.Create(nil);
      Boundary := ExtractHeaderSubItem(Request.ContentType, 'boundary', QuoteHTTP);
      TIdMessageDecoderMIME(Decoder).MIMEBoundary := Boundary;
      Decoder.FreeSourceStream := False;
      Decoder.SourceStream := Request.PostStream;
      //Decoder.ReadLn();
      Decoder.ReadHeader;
      if Decoder.PartType=mcptAttachment then
        Decoder.ReadBody(Stream,MsgEnd);

      FreeAndNil(Stream);
    End;
  End;
  Response.ResponseNo:=200;
end;
Das Klappt auch aber in der Datei die ich auf dem Windows PC Speichere sind nach jeder Zeile ein HEX(0A) und ich weis nicht warum kann mir jemand helfen.

sx2008 18. Jul 2013 12:50

AW: Preoblem mit Dateiupload PHP>Delphi
 
Du benützt Request.Params nicht richtig.
Besser:
Delphi-Quellcode:
If Request.Params.Values['mode'] = 'upload' then
begin
  filename := Request.Params.Values['id']; // oder heisst der Parameter 'Foo'?
  // vorsicht sicherheitslücke
  // Parameter id muss geprüft werden, ansonsten könnte ein Angreifer
  // Dateien in anderen Verzeichnissen auf dem Filesystem erzeugen
  Stream:=TFileStream.Create(filename+'.pdf',fmCreate);
Desweiteren ist es unnötig
Delphi-Quellcode:
FreeAndNil(Stream)
zu verwenden;
Delphi-Quellcode:
Stream.Free
reicht.
Objekt
Delphi-Quellcode:
Decoder
wird nicht freigegeben.

Dein eigentliches Problem hat wohl mit
Delphi-Quellcode:
TIdMessageDecoderMIME
zu tun.
Bist du sicher, dass du eine aktuelle Indy-Version verwendest?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz