Delphi Can

Orjinalini görmek için tıklayınız: webbrowser form file nesnesine dosya ekleme
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Sayfalar: 1 2
İyi çalışmalar arkadaşlar.

Web formundaki dosya nesnesine aşağıdaki yöntemleri kullanarak dosya eklemeye çalıştım ancak bir türlü başarıya ulaşamadım.

Forumlara baktım ama onlarda da bişey bulamadım. Son çare buradan destek almak istedim.

Yardımcı olabileceklere şimdiden teşekkürler.

//--düzeltme---
program form üzerindeki alanların 4 alan hariç (talep o yönde) tamamını dolduruyor ve nesneleri readonly yapıyor.  Ayırdığımız 4 alanı kullanıcı kendisi doldurduktan sonra gönder butonuna basıyor.

program formun input:file nesnesine değer atayarak dosya  ismini kullanıcının form üzerinde görmesi gerekiyor. gönderdiğim kodlar değer atamasını bir türlü yapamıyor.

kalabalık etmemesi için formun sadece input:file satırını ekliyorum.

Kod:
<input class="form-control" type="file" size="50" id="evrak_file" name="evrak_file">

Delphi: v.10.4

WebBrowser.OleObject.Document.GetElementByID(fieldName).SetAttribute('value', newValue );

var
 theForm: IHTMLFormElement;
 field: IHTMLElement;
begin
 theForm:= _GetFormByNumber(WebBrowser,formNumber);
 field := theForm.Item(fieldName,0) as IHTMLElement;
(field as IHTMLInputFileElement).select;
(field as IHTMLInputFileElement).value:= newValue;

procedure _addItemFile( WebBrowser:tWebBrowser;itemId:string);
var
 doc: IHTMLDocument2;
 i: Integer;
begin
 doc:=WebBrowser.Document as IHTMLDocument2;
 for i:=0 to doc.all.length-1 do
 begin
     if (doc.all.item(i, 0) as IHTMLElement).id=itemId then
        (doc.all.item(i, 0) as IHTMLInputFileElement).value := 'c:\1.JPG';

 end;

end;
HTML yapısını vermemişsiniz, bu kodlarınızın ilgili sayfa istekletine uygun olup olmadığını - ki uygun değil ki dosya gönderilemiyor- bilemeyiz. 

Dosya adını verip öylece gönder diyemezsiniz. FormData'nın oluşmasını sağlayacak javascript vb. kodun işletilmesi lazım. Verdiğiniz kod parçaları sadece değer ataması yapıyor görünüyor, işletme kısmını yazmamışsınız.

Sonuç olarak havanda su dövmektense bu linkteki çözümleri denemek isteyebilirsiniz.

Başarılar
Muharrem bey yardımınız için teşekkürler. ilk başta indy ile direkt post ediyorduk ve sorunsuzdu. fakat aşağıdaki şekilde olması talep edildi.

program form üzerindeki alanların 4 alan hariç (talep o yönde) tamamını dolduruyor ve nesneleri readonly yapıyor.  Ayırdığımız 4 alanı kullanıcı kendisi doldurduktan sonra gönder butonuna basıyor.

program formun input:file nesnesine değer atayarak dosya  ismini kullanıcının form üzerinde görmesi gerekiyor. gönderdiğim kodlar değer atamasını bir türlü yapamıyor.

kalabalık etmemesi için formun sadece input:file satırını ekliyorum.

Kod:
<input class="form-control" type="file" size="50" id="evrak_file" name="evrak_file">
post ettiğiniz metoddaki kullanıcı bilgilerini girilmemiş olabileceğinden yola çıkarak, başarılı olduğunuz teknik üzerinden bu web formunu simüle ederek, sonucu browse edip kullanıcıya sanki bu webbrowser ile gönderilmiş gibi olamıyor mu?

Yani web formunu siz kendi formunuz şeklinde tasarlayıp, ürünü webbrowser ile görüntülemekten kasıt

Neden bu alternatif çözümleri sunuyoruz, sizin site ile irtibatlı test imkanı olmadığından. Sizin ne yaptığınız ile sitenin ne beklediğini bilmemiz imkansız
Güvenlik verim hız başta olmak üzere bir sürü özellik saydım ikna edemedim. Çok çeşitli çözüm yolları önerdik ancak bu şekilde olması isteniyor. Patronlar da müşteriyi destekleyince mecburen buna dönüş yaptım.

Bu şekilde işim çok daha zorlaştı.

Forma html kod ekleme, form nesneleri doldurma, javascript ve jQuery kodları ekleme ve çalıştırma vb. bir sürü ek iş çıktı. bunların tamamı sorunsuz. çalışıyor.

Tek derdim neden dosya ataması yapamıyorum.

Denizi geçip derede boğuluyormuş gibi hissediyorum Sad
@mrmarman
Muharrem Bey merhabalar,
https://stackoverflow.com/a/42126148/2804269 linkindeki işaret etmiştiniz.
Delphi 10.4.2'de TIdMultipartFormDataStream hangi unit içinde acaba? Bulamadım bir türlü...
Bunu kaldırmışlr mı, alternatifi nedir?
Teşekkür ediyorum.
@ferhatcelik aşağıdaki şekilde sondaki sitede belirtilen şekilde değil de sondaki "stream" yazan kısmını atarak deneyebilirsiniz.



uses
  IdHTTP, IdMultipartFormData;

Üstadım, çok teşekkür ediyorum ve de özür diliyorum.
Bu konu için bir post açmıştım ve o arada cevabı bulduğum için postu silmiştim, ama burdaki soruyu silmeyi düşünemedim.
Allah eksikliğinizi göstermesin, selamlar...
@ferhatcelik

WEB'de hiç örnek bulamadım demişsiniz.

Sizin için hem Delphi hem de PHP tarafı olmak üzere bir örnek çifti hazırladım.

PHP Yakası ( php ile aynı klasörde yeni bir klasör oluşturun. Adı örnekteki gibi "uploadedimages" olsun )
--------------------------------------------------------------------------------------------------------------------------
PHP Kod:
<?php
   
if(isset($_FILES['image'])){
 
     $errors= array();
 
     $file_name $_FILES['image']['name'];
 
     $file_size =$_FILES['image']['size'];
 
     $file_tmp =$_FILES['image']['tmp_name'];
 
     $file_type=$_FILES['image']['type'];
 
     $file_ext=strtolower(end(explode('.',$_FILES['image']['name'])));
 
     
      $extensions
= array("jpeg","jpg","png");
 
     
      if
(in_array($file_ext,$extensions)=== false){
 
        $errors[]="sadece JPEG veya PNG dosya kabul edilir.";
 
     }
 
     
      if
($file_size > (3*1024*1024)){
 
        $errors[]='Dosya uzunluğu 3 MB\'dan daha küçük olmalı';
 
     }
 
     
      if
(empty($errors)==true){
 
        move_uploaded_file($file_tmp,"uploadedimages/".$file_name);
 
        echo "Upload işlemi başarılı.";
 
     }else{
 
        print_r($errors);
 
     }
 
  }
?>
<html>
   <body>
      
      <form action="" method="POST" enctype="multipart/form-data">
         <input type="file" name="image" />
         <input type="submit"/>
      </form>
      
   </body>
</html> 


Delphi Yakası :
---------------------
uses
  IdHTTP, IdMultipartFormData, IdSSLOpenSSL, IdGlobal;

function UploadFilesHttpPost(const aUrl: string; aFilename :string): string;
var
  IdHTTP    : TIdHTTP;
  OpenSSL   : TIdSSLIOHandlerSocketOpenSSL;
  PostData  : TIdMultipartFormDataStream;
begin
  IdHttp    := TIdHttp.Create(nil);
  OpenSSL   := TIdSSLIOHandlerSocketOpenSSL.Create(Nil);
  PostData  := TIdMultipartFormDataStream.Create;
  try
    PostData.AddFile( 'image', aFilename );

    With OpenSSL do begin
      SSLOptions.Method      := sslvSSLv23;
      SSLOptions.Mode        := sslmUnassigned;
      SSLOptions.VerifyMode  := [];
      SSLOptions.VerifyDepth := 0;
    end;

    With IdHTTP do begin
      IOHandler              := OpenSSL;
      Request.ContentType    := 'multipart/form-data';
      Request.UserAgent      := 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36';
    end;

    Result := IdHTTP.Post(aUrl, PostData);
  finally
    OpenSSL.Free;
    IdHTTP.Free;
    PostData.Free;
  end;
end;


Örnek Kullanımı : ( kendi test sunucumda denedim )
---------------------------------------------------------------------
procedure TForm1.BitBtn1Click(Sender: TObject);
var
  LUploadPic : String;
begin
  LUploadPic := ExtractFilePath(ParamStr(0)) + 'Sample.jpg';
  if fileexists( LUploadPic )
    then Memo1.Lines.Text := UploadFilesHttpPost( 'https://www.kendiwebsunucunuz.com/upload/index.php', LUploadPic );
end;
Çok teşekkürler, sağolun varolun Muharrem Hocam...
Sayfalar: 1 2