datasnaptan telefona resim yükleme

FireMonkey ve Mobil uygulama (iOS, Android, Windows Phone) ile ilgili sorularınızı bu foruma sorabilirsiniz.
Cevapla
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

datasnaptan telefona resim yükleme

Mesaj gönderen mustafasoy »

basit anlamda server methodum

Kod: Tümünü seç

function TServerMethods1.getimage: TStream;
begin
  Result := TFileStream.Create('d:\1000.bmp', fmOpenRead or fmShareDenyNone);
end;
datasnap servere vcl form ile bağlanılarak resim gösteriliyor

Kod: Tümünü seç

procedure TForm2.Button1Click(Sender: TObject);
var
x:TServerMethods1Client;
i:Integer;
begin
x:=TServerMethods1Client.Create(SQLConnection1.DBXConnection);
Image1.Picture.Bitmap.LoadFromStream(x.getimage);
end;

ancak androidde image içerisine resimi yükleyemedim ,biraz araştırdığımda çok fazla sorunla karşılaşana rastladım
bu konuda alternatif çözüm bulabilirmiyiz?
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen thelvaci »

Datasnap gibi katmanlı mimarilerde; kullandığınız fonksiyonların geri dönüş tiplerini mümkün mertebe primitive data tipleri olarak belirtmelisiniz. Kompleks veri türlerinin dönmesi icap ediyorsada bunu json gibi formatlarla dönmeniz son derece esnek bir yapı kurmanıza yardımcı olur.

Katmanlı mimarileri kodlarken, genellikle bu ara katmana erişen client uygulamaları da kendimizin yazacağını düşünür ve esneklikten taviz veririz. Örneğin; TDeneme isimli bir sınıfı katmanlı mimaride bir fonksiyonun geri dönüş değeri olarak ayarlayabiliriz yada sadece Delphi'nin anlayabileceği veri tiplerini de kullanabiliriz. Ancak, ilerleyen zamanlarda bir başka dil ile yada bir başka platformda aynı katmana bağlanma ihtiyacı hasıl olur ise; bu durumda ilgili katmanı yeni baştan yazmak yada her platform/dil için ek bazı metodları implemente etmek zorunda kalırız.

Velhasıl, nacizane tavsiyem; ilk aşamada biraz zorlasa da katmanlı mimari için mümkün mertebe json döndüren metodlar yazarsanız ileride bunun faydasını görebilirsiniz.
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen mustafasoy »

merhaba tuğrul bey cevap için teşekkürler , tstream olarak geri dönüş yapmaya çalıştım vcl formdan stream okunuyor sorunsuz bir şekilde
android tarafında range check error hatası veriyor
birkaç örnek buldum jsonarray olarak geri dönüş yapıyor
ancak bundada entresan hatalar verdi
server tarafı

Kod: Tümünü seç

function TServerMethods1.x_DownloadJPEGFile(sFilePath: string): TJSONArray;
var
  memorystream : TMemoryStream;
  jsonArray    : TJSONArray;
  img:TImage;
begin
  img:=TImage.Create(self);
  memorystream := TMemoryStream.Create;
  img.Picture.LoadFromFile(sFilePath);
  img.Picture.Graphic.SaveToStream(memorystream);
  memorystream.Position := 0;
  jsonArray := TJSONArray.Create;
  jsonArray := TDBXJSONTools.StreamToJSON(memorystream, 0, memorystream.Size);
  memorystream.Free;
  Result := jsonArray;//;.ToString();
end;
client tarafı

Kod: Tümünü seç

procedure TForm2.Button2Click(Sender: TObject);
var
x:TServerMethods1Client;
strStream:TStream;
begin
x:=TServerMethods1Client.Create(SQLConnection1.DBXConnection);
strStream :=TDBXJSONTools.JSONToStream(x.x_DownloadJPEGFile('d:\korgun\resim\1002.jpg'));
strStream.Position := 0;
Image1.Picture.Graphic.LoadFromStream(strStream);
ancak her iki şekilde de sonuca ulaşamadım json olarak vcl formdan bile resimi okuyamadım
bu arada belirtmek isterim ki tcp olarak datasnapa bağlantı yapıyorum http olarakmı bağlanmak gerekir acaba ?
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen thelvaci »

Merhaba, bildiğim kadarı ile Datasnap stream verileri 32k yada 64k 'lık paketler halinde yolluyordu. Dolayısı ile verinin nerede sonlandığı ile ilgili bir sıkıntı mevcut. Bunun için; client tarafında aşağıdaki gibi bir döngüye girmeniz lazım. Küçük bir örnek vereyim, siz kendi uygulamanızda deneyin:

Kod: Tümünü seç

// Server tarafında..
{$METHODINFO ON}
  TServerMethods1 = class(TDataModule)
  private
    { Private declarations }
  public
    { Public declarations }
    function EchoString(Value: string): string;
    function ReverseString(Value: string): string;

    function GetFile(out ASize : Int64) : TStream;
  end;
{$METHODINFO OFF}

function TServerMethods1.GetFile(out ASize : Int64): TStream;
var
  F : TFileStream;
begin
  F := TFileStream.Create('E:\BirResim.png', fmOpenRead);

  try
    Result := TMemoryStream.Create;

    Result.CopyFrom(F, F.Size);
    Result.Position := 0;
    ASize := Result.Size;
  finally
    F.Free;
  end;
end;

// Client tarafında..
procedure TForm3.Button1Click(Sender: TObject);
const
  BuffSize  = 1024;
var
  proxy : TServerMethods1Client;
  mem   : TStream;

  Buffer: PByte;
  ASize : Int64;
  LocalStream : TFileStream;
  BytesRead : Integer;
begin
  SqlConnection1.Open;

  proxy := TServerMethods1Client.Create(SqlConnection1.DBXConnection);
  mem := proxy.GetFile(ASize);
  
  try
    LocalStream := TFileStream.Create('e:\test.png', fmCreate or fmShareDenyNone);
    mem.Position := 0;

    GetMem(Buffer, BuffSize);

    repeat
      BytesRead := mem.Read( Pointer( Buffer )^, BuffSize );

      if BytesRead > 0 then
        LocalStream.WriteBuffer( Pointer( Buffer )^, BytesRead );
    until ( BytesRead < BuffSize );
  finally
    mem.Free;
    LocalStream.Free;
  end;  
end;
Sanıyorum yukarıdaki yaklaşım sorununuzu çözecektir.
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen mustafasoy »

ilginiz için teşekkürler tuğrul bey ancak sorunumu çözemedim , boşunamı kürek çekiyorum diye düşünmeye başladım
normalde çok fazla kaynak bulunması gerekirken bu konuda çok kısıtlı ve benim gibi arayış içinde olanların yazdığı sorular ve onlara verilen üstünkörü cevaplardan ibaret,
eğerki vcl form kullanacaksam sorunsuz olarak resimi alabiliyorum ancak mobil tarafta bu işler nasıl yürüyor emin değilim
yani örneğin bir stok kartının resimini mobil üzerinden gösterileceğini düşündüğümde en mantıklısı veritabanı içinde tutmaktansa
serverda d:\resim\1000.jpg olarak pathini tutmak olacaktır.
Ardından mobil üzerinden ilgili stoğun resim'i istenildiğinde ise ilgili path datasnap'a gönderilir ve geriye json yada stream olarak sonuç döner bunuda resime geri çeviririm diye düşünmüştüm , hala doğru yol bu gibi geliyor ancak alternatif çözümlere açığım takıldım kaldım bu konuda.
aşağıdaki şekilde datasnap üzerinden upload yapabiliyorum aynı şekilde geri almak istiyorum

Kod: Tümünü seç

procedure TServerMethods1.x_UploadFile(str: TStream; klasoradi, dosyaadi: String);
var
  aFileStream: TFileStream;
  BytesReadCount: Integer;
  Buffer: array [1 .. 16 * 1024] of Byte;
  strPfad: String;
begin
  strPfad := 'C:\' + klasoradi;
  if not DirectoryExists(strPfad) then
  begin
    MkDir(strPfad);
  end;
  aFileStream := TFileStream.Create(strPfad + '\' + dosyaadi, fmCreate);
  try
    repeat
      BytesReadCount := str.Read(Buffer, SizeOf(Buffer));
      aFileStream.Write(Buffer, BytesReadCount);
    until (BytesReadCount < SizeOf(Buffer));
    str.Position := 0;
  finally
    aFileStream.Free;
  end;
end;
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen thelvaci »

Button1'in OnClick metodu içinde size göndermiş olduğum kod uzak sunucu üzerinden gelen bir stream'i indiriyor zaten client'a. Bu client'ın Android, IOS, Windows vb. olması pek farketmemeli kanımca. Size gönderdiğim örneği denediğiniz halde, uzak sunucudan ilgili stream'in gelmediğini mi söylüyorsunuz, yoksa bir hata mı alıyorsunuz ? Stream geliyor ise eğer; bu durumda, gelen stream'i bir TImage içinde gösterebilir yada kayıt edebilirsiniz.

Ben sorunun nereden kaynaklandığını açıkçası tam olarak anlayamadım ?
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen mustafasoy »

base64 kullanarak sorunu çözdüm
servermethod olarak client tarafından gonderilen pathdeki resimi base64 olarak cliente gönderiyorum
clientte base64 u tekrar resim dosyasına donusturuyorum
su anda saglıklı olarak calısıyor, ilginiz için teşekkürler tuğrul bey
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: datasnaptan telefona resim yükleme

Mesaj gönderen hi_selamlar »

Merhaba

Rica etsem nasıl cozdugunuzu paylasirmisiniz. Aynı işlem bende de var. Bende bir türlü başaramadım.

Server ve client taraflarında nasıl bir islem yol izlemeliyiz.

Teşekkürler..
Herkes cahildir, bazi konularda.
Kullanıcı avatarı
mustafasoy
Üye
Mesajlar: 154
Kayıt: 02 Ağu 2013 05:00
Konum: istanbul
İletişim:

Re: datasnaptan telefona resim yükleme

Mesaj gönderen mustafasoy »

selam, su an mobilim , kisa süre icinde örnek gönderirim
Nasıl ki Soru sorarak öğrendiyseniz , öğrendiklerinizi cevap vererek öğretiniz.
Kullanıcı avatarı
hi_selamlar
Üye
Mesajlar: 523
Kayıt: 05 May 2005 03:24
Konum: DelphiTürkiye.COM

Re: datasnaptan telefona resim yükleme

Mesaj gönderen hi_selamlar »

Teşekkürler hocam.

Sabırsızlıkla bekliyoruz..
Herkes cahildir, bazi konularda.
Cevapla