Проблема – не могу передать изображение с клиента на сервер DataSnap и сохранить в СУБД MySQL…
Компоненты
На сервере… …в методах сервера…
На клиенте… …на главной форме клиента…
Коды и способы загрузки
1 “Прямой” способ…
На клиенте…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
procedure TForm2.Button1Click(Sender: TObject); var bmp:tbitmap; twic:twicimage; begin bmp:=tbitmap.Create; twic:=twicimage.Create; opendialog1.Execute; twic.LoadFromFile(opendialog1.FileName); bmp.Assign(twic); clientdataset1.append; clientdataset1.FieldByName('Primary_key').AsInteger:=clientdataset1.RecordCount+1; clientdataset1.FieldByName('Picture').Assign(bmp); clientdataset1.Post; clientdataset1.ApplyUpdates(0); //clientdataset1.Refresh; clientdataset1.Close; clientdataset1.Open; end; |
Результат “прямого” способа…
Если закрыть и открыть клиент снова – пустые поля… То есть в СУБД…. ничего не сохранилось…
2. Способ через строку…
На клиенте…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
procedure TForm2.Button5Click(Sender: TObject); var SMC:TServerMethods1Client; ms:tmemorystream; twic:twicimage; bmp:tbitmap; ss:tstringstream; s:widestring; begin smc:=TServerMethods1Client.Create(sqlconnection1.DBXConnection); ss:=tstringstream.Create; bmp:=tbitmap.Create; twic:=twicimage.Create; opendialog1.Execute; twic.LoadFromFile(opendialog1.FileName); bmp.Assign(twic); bmp.SaveToStream(ss); s:=ss.DataString; // Проверка длины строки на клиенте... showmessage('string on client '+inttostr(length(s))); smc.GetString(s); clientdataset1.Refresh; clientdataset1.Close; clientdataset1.Open; end; |
На сервере DataSnap…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
procedure TServerMethods1.GetString(s: widestring); var ss:Tstringstream; ms:tmemorystream; bmp:tbitmap; begin showmessage('on server ' + inttostr(length(s))); {Проверка на сервере...} ss:=tstringstream.Create(s); bmp:=tbitmap.Create; //ms.LoadFromStream(ss); bmp.LoadFromStream(ss); simpledataset1.Append; simpledataset1.FieldByName('Primary_key').AsInteger:=simpledataset1.RecordCount+1; TBlobfield(simpledataset1.FieldByName('Picture')).AsString:=s; simpledataset1.Post; simpledataset1.ApplyUpdates(-1); simpledataset1.Close; simpledataset1.Open; end; |
Результат 2 способа через строку
Строка до сервера доходит…. (проверка длины строки)
Но, почему-то картинка в СУБД не сохраняется… Если закрыть и открыть программу, видим ту же самую картину – пусто…
Либо, если из консоли MysQL…
3 Способ через потоки…
На клиенте…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
procedure TForm2.Button4Click(Sender: TObject); var SMC:TServerMethods1Client; ms:tmemorystream; twic:twicimage; bmp:tbitmap; begin smc:=TServerMethods1Client.Create(sqlconnection1.DBXConnection); ms:=tmemorystream.Create; bmp:=tbitmap.Create; twic:=twicimage.Create; opendialog1.Execute; twic.LoadFromFile(opendialog1.FileName); bmp.Assign(twic); bmp.SaveToStream(ms); if ms<>nil then showmessage(inttostr(ms.Size)); smc.GetPicture(ms); end; |
На сервере…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
procedure TServerMethods1.GetPicture(filename: Tmemorystream); var ms1:tmemorystream; bmp:tbitmap; image:timage; f:tform; begin bmp:=tbitmap.Create; ms1:=tmemorystream.Create; ms1.LoadFromStream(filename); showmessage(inttostr(filename.Size)); // Проверка размера потока... // showmessage(inttostr(ms1.Size)); // Проверка размера потока... simpledataset1.Insert; simpledataset1.FieldByName('Primary_key').AsInteger:=simpledataset1.RecordCount+1; simpledataset1.FieldByName('Picture').Assign(bmp); Tblobfield(simpledataset1.FieldByName('Picture')).Assign(bmp); simpledataset1.Post; simpledataset1.ApplyUpdates(-1); end; |
Результат 3 способа…
На клиенте – поток не нулевой….
А вот до сервера, почему-то не доходит… размер потока равен нулю…
Исходный код моих попыток…
Если Вы знаете в чем может быть дело хотя бы по одному из способов – прощу написать мне на почту panteleevstas@gmail.com