Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Uzak sunucudaki veritabanına IdHTTTP ile resim yükleme
#11
Resim dosyalarının ilk bir kaç baytında hangi format olduğu ile ilgili bir imza bulunur. Bunu analiz ederek tespit edebilirsiniz;

ne aramanız gerektiği ile ilgili bilgi mahiyetinde ;

https://www.file-recovery.com/gif-signature-format.htm
https://www.garykessler.net/library/file_sigs.html
YouTube Delphi Tips
"Mantıklı adam kendini dünyaya uyarlar; mantıksız adam ise dünyayı kendine uydurmakta inat eder. Bu nedenle, tüm ilerleme o inatçı adama bağlıdır." - George Bernard Shaw
WWW
Cevapla
#12
"Kontrolsüz güç güç değildir" mottosunu çok beğenmişimdir. Lastik reklamı... Smile

* Resmi gönderen de alan da siz misiniz ? İki aşamalı gönderim yapın. Önce tipine işaret edin, ardından stream edin.

Diğer yandan web tarafında yapabiliyorsanız stream başına bir byte ekleyin tipini ifade etsin, o byte'ı delphi tarafında silin ve doğru / ilgili tipteki taşıyıcıya yükleyin. Gönderim aşamasını teke indirmiş, Delphi tarafında çözümlemiş olursunuz.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif
Cevapla
#13
(14-07-2020, Saat: 13:31)KarahanMesut Adlı Kullanıcıdan Alıntı: Şimdi İlk ksımı halletim resimleri kaydediyorum çekmesine çekiyorum ama sadece tek tipte çekiyorum  burda çektiğim resmi jpg mi png mi yoksa gif mi nasıl ayırt edebilirim acaba ?


procedure TUrunEkleForm.getImage(image:String);
var
MS : TMemoryStream;
GIf: TGIFImage;
Jp:TJPEGImage;
Png:TPngImage;
begin
 MS := TMemoryStream.Create;
 GIf := TGIFImage.Create;
 Jp:=TJPEGImage.Create;
 Png:=TPngImage.Create;
 try



  IdHTTP1.get(image,MS);
   Ms.Seek(0,soFromBeginning);
   //Gif.LoadFromStream(MS);
   Jp.LoadFromStream(MS);
   prdimage.Picture.Assign(Jp);
   



 finally
   FreeAndNil(Jp);
   FreeAndNil(MS);
 end;

end;
Merhaba,
öncellikle dosyamızı seçelim:

 if OpenDialog1.Execute then
 begin
  if Length(OpenDialog1.FileName) > 0  then
  begin
   dosyaURL := OpenDialog1.FileName;
   Image1.Picture.LoadFromFile(dosyaURL);
  end;
end;

Seçilen dosya public değişkenlere atanmaktadır. Bu yüzden public kısmında dosyaUrl(String) ve Base64LiHali(AnsiString) şeklinde 2 tanım ekleyiniz. Sonrasında dosyamızı base64 şeklinde kodlayacak fonksiyonumuzu oluşturalım.

function EncodeFile(const FileName: string): AnsiString;
var
 stream: TMemoryStream;
begin
 stream := TMemoryStream.Create;
 try
   stream.LoadFromFile(Filename);
   result := EncodeBase64(stream.Memory, stream.Size);
 finally
   stream.Free;
 end;
end;

Bu fonksiyonun çalışabilmesi için kütüphanenize, EncdDecd sınıfını ekleyiniz. Sonrasında ise seçilen dosyamızı base64 şeklinde formatlayalım.  

 Base64LiHali := EncodeFile(dosyaURL);

Bundan sonrası bildiğiniz POST işlemi. Bu örnek için bir sunucu örneği hazırlayamam, üzgünüm. Şimdi diğer konuya geçelim, o da sunucu tarafı. Sunucu tarafında ise bu işlemlerin tersini yapmanız gerekecek. Bunun içinde aşağıdaki fonksiyon işinizi görecektir:

procedure DecodeFile(const base64: AnsiString; const FileName: string);
var
 stream: TBytesStream;
begin
 stream := TBytesStream.Create(DecodeBase64(base64));
 try
   stream.SaveToFile(Filename);
 finally
   stream.Free;
 end;
end;

Elde ettiğiniz dosyayı veritabanına kaydetme işlemi de sizde, topu size bıraktım.


Uzantı konusunda.....
Bunun için aklıma parity mantığı geldi. Yani eşlik biti. Eğer veri bozuk ise kuyruğa eklenen bit mantığında. Bizde buna benzer bir şey yapalım. Ya da direkt XML'e girelim. İlk olarak iki adet node olacak. Bunlar <base64> ve <uzanti> olacaktır. Şimdi XML'i hazırlayalım.


function TForm1.XMLHazirla(): String;
begin
 Result := '<base64>' + Base64LiHali + '</base64>' + sLineBreak +
 '<uzanti>' + ExtractFileExt(dosyaURL) + '</uzanti>';
end;


şeklinde bir XML oluşturabiliriz. Basitçe ele aldım. Peki sunucu tarafında ne yapılacak? Bu XML'i çeşitli yollar ile parçalayabiliriz fakat benim kullandığım ve bu durumun basit olmasından dolayı kolay bir fonksiyon ile halledelim. Sunucu tarafında olduğunuzu hayal edin;

function Parse(Text, Sol, Sag: string): String;
begin
 Delete(Text, 1, Pos(Sol, Text) + Length(Sol) - 1);
 Result := Copy(Text, 1, Pos(Sag, Text) - 1);
end;

Bu fonksiyonu şu şekilde kullanacağız.

 ///atamalar
  Base64 := Parse(XML, '<base64>', '</base64>');
 Uzanti := Parse(XML, '<uzanti>', '</uzanti>');


Bundan sonrası dediğim gibi veritabanı kayıt işlemleri.
İyi çalışmalar dilerim.
kisisel_logo_dark.png
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Online Xslt Editör | Base64 Resim Dönüştürme ahmet6513 5 1.515 08-08-2025, Saat: 12:30
Son Yorum: ahmet6513
  lazreportda resim gosterme sadikacar60 0 408 14-12-2024, Saat: 20:08
Son Yorum: sadikacar60
  Delphi Paket Yükleme (Warning) kajmerantime 4 929 13-11-2024, Saat: 11:52
Son Yorum: kajmerantime
  Excel tablosuna resim ekleme enigma 3 1.211 21-05-2024, Saat: 12:16
Son Yorum: enigma
  JSON Verilerini Veritabanına Kaydetmek kajmerantime 6 1.800 03-11-2023, Saat: 15:05
Son Yorum: kajmerantime



Konuyu Okuyanlar: 1 Ziyaretçi