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