AndroidHalfNoob Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 После различных экспериментов с БД пришел к выводу, что лучше картинки хранить на хостинге в отдельной папке, а не в БД в blob-полях. так как при хранении фото размером 2-3 мегабайта, увеличивается нагрузка на базу и переменная TBitmap не способна вместить в себя такой объем данных. самый рациональный способ хранить в БД имена файлов на фото и в программу уже подгружать эти фото с хостинга. В связи с этим прошу помощи в объяснении технологии и принципа загрузки и считывания фото. Какие компоненты использовать для подключения к хостингу Ссылка на комментарий
Vitaldj Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 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] ); Ссылка на комментарий
krapotkin Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 сейчас надо бы отказываться от indy, а то программа и так пухлая, есть нативный HTTPClient а в остальном - делаем кэш по-любому на устройстве, создаем потоки, в которых происходит закачка либо из кэша либо через HTTP когда поток заканчивается, результат работы он передает на отображение по поводу отображения тут была статья про listView и 1000 картинок. К сожалению, поиск на форуме очень странный и я чаще всего не могу найти нужную ссылку DirtyBorov 1 Ссылка на комментарий
Модераторы Равиль Зарипов (ZuBy) Опубликовано 22 апреля, 2016 Модераторы Поделиться Опубликовано 22 апреля, 2016 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 нельзя присвоить картинку загруженную в отдельном потоке. Поэтому пользуемся хелперами для загрузки файлов, на форуме не раз обсуждалось zairkz 1 Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 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. Ссылка на комментарий
Vitaldj Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 (изменено) 3 минуты назад, krapotkin сказал: сейчас надо бы отказываться от indy, а то программа и так пухлая, есть нативный HTTPClient а в остальном - делаем кэш по-любому на устройстве, создаем потоки, в которых происходит закачка либо из кэша либо через HTTP когда поток заканчивается, результат работы он передает на отображение по поводу отображения тут была статья про listView и 1000 картинок. К сожалению, поиск на форуме очень странный и я чаще всего не могу найти нужную ссылку Про отказ от indy согласен, но проект написан сто лет назад, закачивает 1-3 файла, все работает как часы, поэтому не заморачиваюсь))). Там более в indy использую прокси и аутентификацию, все работает. Может конечно это есть и в нативном HTTPClient, но неохота разбираться и переписывать гору кода. Изменено 22 апреля, 2016 пользователем Vitaldj Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 нашел тему буду экспериментировать. Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 (изменено) Цитата 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/ Изменено 22 апреля, 2016 пользователем AndroidHalfNoob Ссылка на комментарий
Vitaldj Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 Что я не понял, а вначале с чего запускаете? И почему выбрали ftp , а не http ? Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 6 минут назад, Vitaldj сказал: Что я не понял, а вначале с чего запускаете? И почему выбрали ftp , а не http ? запускаю на телефоне. через http выдает ошибку HTTP/1.1 301 Moved Permanently Ссылка на комментарий
Vitaldj Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 3 минуты назад, AndroidHalfNoob сказал: запускаю на телефоне. через http выдает ошибку HTTP/1.1 301 Moved Permanently Ну что то мне подсказывает, что вы путь не правильно указываете. Если в простой браузер копируете этот путь, картинка открывается? Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 нет. открывается сайт со стартовой страницы. Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 я тоже думал что что то с путями и видимо оно так и есть. поколдовал через браузер и нашел правильный путь. картинка открылась на странице. Ссылка на комментарий
Vitaldj Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 5 минут назад, AndroidHalfNoob сказал: я тоже думал что что то с путями и видимо оно так и есть. поколдовал через браузер и нашел правильный путь. картинка открылась на странице. Ну так и попробуйте этот ПРАВИЛЬНЫЙ путь в http вставить;)) Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 2 минуты назад, Vitaldj сказал: Ну так и попробуйте этот ПРАВИЛЬНЫЙ путь в http вставить;)) Уже......:) все работает. в связи с этим вопрос: как лучше... через http или ftp подключаться? Ссылка на комментарий
Vitaldj Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 я бы через http)). проверено! zairkz 1 Ссылка на комментарий
Rusland Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 (изменено) 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 и прописывайте Изменено 22 апреля, 2016 пользователем Rusland Ссылка на комментарий
Модераторы Равиль Зарипов (ZuBy) Опубликовано 22 апреля, 2016 Модераторы Поделиться Опубликовано 22 апреля, 2016 FTP тут не нужен, работайте по HTTP, 301 ошибка указывает на переадресацию Ссылка на комментарий
AndroidHalfNoob Опубликовано 22 апреля, 2016 Автор Поделиться Опубликовано 22 апреля, 2016 и как писал ZuBy в дальнейшем не получится то что я считал в поток присвоить маркеру? так как загрузка в маркер идет обменом через TBitmap. Ссылка на комментарий
krapotkin Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 надо уточнить, что имелось в виду понятно, что синхронизацию нельзя нарушать, а bitmap можно Assign'ить уже в основном потоке Ссылка на комментарий
krapotkin Опубликовано 22 апреля, 2016 Поделиться Опубликовано 22 апреля, 2016 речь идет о том, что нельзя в битмап лезть в доп потоке ну так и не лезть поток завершается и вызывает событие OnTerminate обработчик этого события работает в основном потоке там можно и присвоить все что нужно zairkz 1 Ссылка на комментарий
AndroidHalfNoob Опубликовано 25 апреля, 2016 Автор Поделиться Опубликовано 25 апреля, 2016 а не подскажете как потом можно все это конвертировать в TBitmap? А то у меня приложение выдает сообщение,что "отсутствует хозяин" Ссылка на комментарий
AndroidHalfNoob Опубликовано 25 апреля, 2016 Автор Поделиться Опубликовано 25 апреля, 2016 Цитата 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 Ссылка на комментарий
Rusland Опубликовано 25 апреля, 2016 Поделиться Опубликовано 25 апреля, 2016 (изменено) А что такое picture? Если он Bitmap, то почему делается image1.Bitmap.LoadFromStream(picture); ? Изменено 25 апреля, 2016 пользователем Rusland Ссылка на комментарий
AndroidHalfNoob Опубликовано 25 апреля, 2016 Автор Поделиться Опубликовано 25 апреля, 2016 Смысл в том что фото с сайта загружается в поток tmemorystream. Далее то что туда загрузили, передается в TBitmap. TBitmap используется для того чтобы передать фото в иконку маркера на карте так как напрямую в маркер нельзя передать tmemorystream. Ссылка на комментарий
Рекомендуемые сообщения