Перейти к содержанию
Fire Monkey от А до Я

Требуется помощь в технологиях


Рекомендуемые сообщения

После различных экспериментов с БД пришел к выводу, что лучше картинки хранить на хостинге в отдельной папке, а не в БД в blob-полях. так как при хранении фото размером 2-3 мегабайта, увеличивается нагрузка на базу и переменная TBitmap не способна вместить в себя такой объем данных. самый рациональный способ хранить в БД имена файлов на фото и в программу уже подгружать эти фото с хостинга.

В связи с этим прошу помощи в объяснении технологии и принципа загрузки и считывания фото. Какие компоненты использовать для подключения к хостингу

Ссылка на комментарий
32 минуты назад, AndroidHalfNoob сказал:

После различных экспериментов с БД пришел к выводу, что лучше картинки хранить на хостинге в отдельной папке, а не в БД в blob-полях. так как при хранении фото размером 2-3 мегабайта, увеличивается нагрузка на базу и переменная TBitmap не способна вместить в себя такой объем данных. самый рациональный способ хранить в БД имена файлов на фото и в программу уже подгружать эти фото с хостинга.

В связи с этим прошу помощи в объяснении технологии и принципа загрузки и считывания фото. Какие компоненты использовать для подключения к хостингу

Фото, это обычные файлы, тем более путь у тебя есть. Что тебе мешает просто закачивать файлы  через IdHTTP. Я конечно груду файлов не закачивал и за скорость не ручаюсь, но вробе работает.

Закачиваю так:

var
tstr : TStringList;
lStream1 : TMemoryStream;
begin


  tstr :=  TStringList.Create;
// tstr  'название вашего файла'
// тут можно цикл организовать
lStream1 := TMemoryStream.Create;
form1.IdHTTP1.Get( 'http://тут ваш хост/file_base_update/'+tstr.Strings[1], lStream1);
lStream1.SaveToFile(ExtractFilePath(ParamStr(0)) + tstr.Strings[1] );
           

 

 

Ссылка на комментарий

сейчас надо бы отказываться от indy, а то программа и так пухлая, есть нативный HTTPClient

а в остальном - делаем кэш по-любому на устройстве, создаем потоки, в которых происходит закачка либо из кэша либо через HTTP

когда поток заканчивается, результат работы он передает на отображение

по поводу отображения тут была статья про listView и 1000 картинок. К сожалению, поиск на форуме очень странный и я чаще всего не могу найти нужную ссылку

 

Ссылка на комментарий
  • Модераторы
10 минут назад, Vitaldj сказал:

Фото, это обычные файлы, тем более путь у тебя есть. Что тебе мешает просто закачивать файлы  через IdHTTP. Я конечно груду файлов не закачивал и за скорость не ручаюсь, но вробе работает.

Закачиваю так:


var
tstr : TStringList;
lStream1 : TMemoryStream;
begin


  tstr :=  TStringList.Create;
// tstr  'название вашего файла'
// тут можно цикл организовать
lStream1 := TMemoryStream.Create;
form1.IdHTTP1.Get( 'http://тут ваш хост/file_base_update/'+tstr.Strings[1], lStream1);
lStream1.SaveToFile(ExtractFilePath(ParamStr(0)) + tstr.Strings[1] );
           

 

нужно помнить что на мобильных в TBitmap нельзя присвоить картинку загруженную в отдельном потоке.

Поэтому пользуемся хелперами для загрузки файлов, на форуме не раз обсуждалось

Ссылка на комментарий
10 минут назад, Vitaldj сказал:

Фото, это обычные файлы, тем более путь у тебя есть. Что тебе мешает просто закачивать файлы  через IdHTTP. Я конечно груду файлов не закачивал и за скорость не ручаюсь, но вробе работает.

Закачиваю так:


var
tstr : TStringList;
lStream1 : TMemoryStream;
begin


  tstr :=  TStringList.Create;
// tstr  'название вашего файла'
// тут можно цикл организовать
lStream1 := TMemoryStream.Create;
form1.IdHTTP1.Get( 'http://тут ваш хост/file_base_update/'+tstr.Strings[1], lStream1);
lStream1.SaveToFile(ExtractFilePath(ParamStr(0)) + tstr.Strings[1] );
           

 

 

GET это же кажется функция получения файла с сервера

выложил на хостинг файл. сейчас попробую скачать его в Image.

Ссылка на комментарий
3 минуты назад, krapotkin сказал:

сейчас надо бы отказываться от indy, а то программа и так пухлая, есть нативный HTTPClient

а в остальном - делаем кэш по-любому на устройстве, создаем потоки, в которых происходит закачка либо из кэша либо через HTTP

когда поток заканчивается, результат работы он передает на отображение

по поводу отображения тут была статья про listView и 1000 картинок. К сожалению, поиск на форуме очень странный и я чаще всего не могу найти нужную ссылку

 

Про отказ от indy согласен, но проект написан сто лет назад, закачивает 1-3 файла, все работает как часы, поэтому не заморачиваюсь))). Там более в indy использую прокси и аутентификацию, все работает. Может конечно это есть и в нативном HTTPClient, но неохота разбираться и переписывать гору кода.

Изменено пользователем Vitaldj
Ссылка на комментарий
Цитата

procedure TForm1.Button1Click(Sender: TObject);
var ms:tmemorystream;
begin
ms:=tmemorystream.Create;
idFTP1.Connect;
idFTP1.Get('http://global.ru/www/global.ru/images/product_images/original_images/10_0.png',ms,true);
idFTP1.Disconnect;

image1.Bitmap.LoadFromStream(ms);
ms.Free;

end;

Название сайта global.ru заменено. но путь до картинки именно такой.

При запуске приложения и нажатии на кнопку выдается сообщение No such file or directory

в настройках компонента прописал хост, порт 21, имя пользователя и пароль ftp аккаунта. подключение проходит, но картинка почему то не грузится. Если запускаю программу на компе и указываю загрузку картинки с локального диска, то все работает.
как узнать правильный путь до картинке на сервере? в менеджере ftp путь указывается как ~www/global.ru/images/product_images/original_images/

Изменено пользователем AndroidHalfNoob
Ссылка на комментарий
6 минут назад, Vitaldj сказал:

Что я не понял, а вначале с чего запускаете? И почему выбрали ftp , а не http ?

запускаю на телефоне. через http выдает ошибку 

HTTP/1.1 301 Moved

Permanently

Ссылка на комментарий
3 минуты назад, AndroidHalfNoob сказал:

запускаю на телефоне. через http выдает ошибку 

HTTP/1.1 301 Moved

Permanently

Ну что то мне подсказывает, что вы путь не правильно указываете. Если в простой браузер копируете этот путь, картинка открывается? 

Ссылка на комментарий
5 минут назад, AndroidHalfNoob сказал:

я тоже думал что что то с путями и видимо оно так и есть. поколдовал через браузер и нашел правильный путь. картинка открылась на странице.

 

Ну так и попробуйте этот ПРАВИЛЬНЫЙ путь в http вставить;))

Ссылка на комментарий
2 минуты назад, Vitaldj сказал:

Ну так и попробуйте этот ПРАВИЛЬНЫЙ путь в http вставить;))

Уже......:)

все работает.

в связи с этим вопрос: как лучше... через http или ftp подключаться?

Ссылка на комментарий
procedure TForm1.Button1Click(Sender: TObject);
var ms:tmemorystream;
begin
ms:=tmemorystream.Create;
idFTP1.Connect;
idFTP1.Get('http://global.ru/www/global.ru/images/product_images/original_images/10_0.png',ms,true);
idFTP1.Disconnect;

image1.Bitmap.LoadFromStream(ms);
ms.Free;

end;

Почему путь указан http://... а не ftp://... ? Раз обращение через IdFTP, то ftp и прописывайте

 

Изменено пользователем Rusland
Ссылка на комментарий

речь идет о том, что нельзя в битмап лезть в доп потоке
ну так и не лезть

поток завершается и вызывает событие OnTerminate
обработчик этого события работает в основном потоке
там можно и присвоить все что нужно

Ссылка на комментарий
Цитата

ms:=tmemorystream.Create;
IdHTTP1.Get('http://сайт/images/Uchastniki/Marker2.jpg',ms);

picture:=TBitmap.Create;
picture.LoadFromStream(ms);


 image1.Bitmap.LoadFromStream(picture);
ms.Free;
picture.Free

но когда пытаюсь передать picture в маркер, то он выдает сообщение что нет хозяина. хотя при таком коде в Image картинка грузится из TBitmap

Ссылка на комментарий

Смысл в том что фото с сайта загружается в поток  tmemorystream. Далее то что туда загрузили, передается в  TBitmap.  TBitmap  используется для того чтобы передать фото в иконку маркера на карте так как напрямую в маркер нельзя передать tmemorystream.

Ссылка на комментарий
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...