Delphi ile Php Upload Post etmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
peafowl
Üye
Mesajlar: 3
Kayıt: 16 Ağu 2010 04:54

Delphi ile Php Upload Post etmek

Mesaj gönderen peafowl »

arkadaşlar, hocalarım, büyüklerim herkese selamlar

bilgisayardaki bir program ile web sitesi arasında bir bağlantı oluşturmaya çalışıyorum. istiyorum ki programım www.site.com/upload.php adresine bağlansın ve atıyorum d:\deneme.jpg dosyasını siteye post etsin. neler denediysem olmadı. inanın onlarca kod aradım yazdım am başaramadım. en son bir net sitesinde bir kod buldum ama maalesef o da çalışmıyor ama çalışmaya en yakını sanıyorum o. kodları veriyorum şimdi acaba inceleyip nerede hata yaptığımı bulabilir miyiz?

Kod: Tümünü seç

procedure UploadFilesHttpPost(const wb:TWebBrowser; const URLstring: string;
names, values, nFiles, vFiles: array of string) ;
var
  strData, n, v, boundary: string;
 URL: OleVariant;
  Flags: OleVariant;
 PostData: OleVariant;
  Headers: OleVariant;
  idx: Integer;
  ms: TMemoryStream;
  ss: TStringStream;
begin
{
  UploadFilesHttpPost(
  WebBrowser1,
  'http://validator.w3.org/check',
  [],
  [],
  ['uploaded_file'],
  ['C:\blank.htm'] );
}
  if Length(names) <> Length(values) then
    raise Exception.Create('UploadFilesHttpPost: Names and Values must have the same length.') ;
  if Length(nFiles) <> Length(vFiles) then
    raise Exception.Create('UploadFilesHttpPost: FileNames and FileValues must have the same length.') ;
  URL := 'about:blank';
  Flags := NavNoHistory or NavNoReadFromCache or NavNoWriteToCache or NavAllowAutosearch;
  wb.Navigate2(URL, Flags) ;
  while wb.ReadyState < READYSTATE_INTERACTIVE
    do Application.ProcessMessages;
  // anything random that WILL NOT occur in the data.
  boundary := '—————————123456789';
  strData := '';
  for idx := Low(names) to High(names) do
  begin
    n := names[idx];
    v := values[idx];
    strData := strData + '–' + boundary + #13#10 +
         'Content-Disposition: form-data; name="' + n + '"' + #13#10#13#10 + v + #13#10;
  end;
  for idx := Low(nFiles) to High(nFiles) do
  begin
    n := nFiles[idx];
    v := vFiles[idx];
    strData := strData + '–' + boundary + #13#10 +
        'Content-Disposition: form-data; name="' + n + '"; filename="' + v + '"' + #13#10;
    if v = '' then
    begin
       strData := strData + 'Content-Transfer-Encoding: binary'#13#10#13#10;
    end
    else
    begin
      if (CompareText(ExtractFileExt(v), '.JPG') = 0)
        or (CompareText(ExtractFileExt(v), '.JPEG') = 0) then
      begin
        strData := strData + 'Content-Type: image/pjpeg'#13#10#13#10;
      end
      else if (CompareText(ExtractFileExt(v), '.PNG') = 0) then
      begin
        strData := strData + 'Content-Type: image/x-png'#13#10#13#10;
      end
      else if (CompareText(ExtractFileExt(v), '.PDF') = 0) then
      begin
        strData := strData + 'Content-Type: application/pdf'#13#10#13#10;
      end
      else if (CompareText(ExtractFileExt(v), '.HTML') = 0) then
      begin
      end;
      strData := strData + 'Content-Type: text/html'#13#10#13#10;
      ms := TMemoryStream.Create;
      try
        ms.LoadFromFile(v) ;
        ss := TStringStream.Create('') ;
        try
          ss.CopyFrom(ms, ms.Size) ;
          strData := strData + ss.DataString + #13#10;
        finally
          ss.Free;
        end;
      finally
        ms.Free;
      end;
    end;
    strData := strData + '–' + boundary + '–'#13#10; // FOOTER
  end;
  strData := strData + #0;
  {2. you must convert a string into variant array of bytes and every
    character from string is a value in array}
  PostData := VarArrayCreate([0, Length(strData) - 1], varByte) ;
  { copy the ordinal value of the character into the PostData array}
  for idx := 1 to Length(strData) do PostData[idx-1] := Ord(strData[idx]) ;
  {3. prepare headers which will be sent to remote web-server}
  Headers := 'Content-Type: multipart/form-data; boundary=' + boundary + #13#10;
  {4. you must navigate to the URL with your
   script and send as parameters your array with POST-data and headers}
  URL := URLstring;
  wb.Navigate2(URL, Flags, EmptyParam, PostData, Headers) ;
  while wb.ReadyState < READYSTATE_INTERACTIVE do
    Application.ProcessMessages;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  UploadFilesHttpPost(
  WebBrowser1,
  'http://127.0.0.1/receiver.php',
  [],
  [],
  ['uploaded'],
  ['d:\deneme.jpg'] );
end;
php kodları

receiver.php

Kod: Tümünü seç

<?
if(move_uploaded_file($_FILES['uploaded']['tmp_name'], $zipfile))
{
      echo "File $zipfile berhasil diupload";
}
else {
     echo "Sorry, there was a problem uploading your file.";    
}
?> 
Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: Delphi ile Php Upload Post etmek

Mesaj gönderen G.Arkas »

html kodlarını koyarmısın sitenin post değerlerine bakalım
Resim
peafowl
Üye
Mesajlar: 3
Kayıt: 16 Ağu 2010 04:54

Re: Delphi ile Php Upload Post etmek

Mesaj gönderen peafowl »

işte sorun burda html kodları yok ve olmasını istemiyorum çünkü oradan multi/type değerler geliyor onları delphi ile post edemiyorum. ben direkt olarak receiver a gönderiyorum kodları
peafowl
Üye
Mesajlar: 3
Kayıt: 16 Ağu 2010 04:54

Re: Delphi ile Php Upload Post etmek

Mesaj gönderen peafowl »

arkadaşlar yok mu yardım edebilecek birisi
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Delphi ile Php Upload Post etmek

Mesaj gönderen emin_as »

Forma bir tane idhttp1 koy ve aşagıdaki unitleri uses a ekle.

Kod: Tümünü seç

uses 
  ...  idMultipartformdata, idglobalprotocols,jpeg  ..
Bir procedure ve kullanacagın değiskenleri tanımla.

Kod: Tümünü seç

procedure ..
var
  ms      : TMemoryStream;
  Multi1  : TIdMultiPartFormDataStream;
  jpg     : TJpegImage;
....
Benim örnekte veritabanındaki bir resmi gönderiyorum, resim yükleme bölümünü istediğin gibi düzenleyebilirsin.
Multi1, jpg kodla oluşturuluyor ve free ediliyor. Ms i free etme, yoksa access violation hatası alırsın.
String degerleri kendi ihtiyacına göre uyarla.

Kod: Tümünü seç

  Multi1 := TIdMultiPartFormDataStream.Create;
  try
      Multi1.AddFormField('user', strUser);
      Multi1.AddFormField('pass',strPass);  

Kod: Tümünü seç

      ms:=TMemoryStream.Create;
      jpg :=TJpegImage.Create;
      try
        jpg.Assign(table1.Fieldbyname('RESIM')); // resmini bu kısımda jpg e yukle
        jpg.SaveToStream(ms);
        multi1.AddObject('resim','image/jpeg',ms,resimadi);
     finally
         jpg.Free;
      end;

Kod: Tümünü seç

      myweb.Request.ContentType := Multi1.RequestContentType;
      Multi1.Position := 0;
      idhttp1.Post(web_adresi, Multi1);
  finally
      multi1.free;
  end;  
end;
Cevapla