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.
Рекомендуемые сообщения