İ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

@
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...