Загрузка большого количества изображений с сервера на Android

Редактировать 2: Даже после щедрот никто не мог дать полного решения. Поэтому я решил это сам. Я разместил свое решение ниже.

Я искал об этом в Google, а также нашел различные хорошие результаты. Но поскольку я не являюсь экспертом в отношении серверных и бэкэндовых терминов, я хотел бы задать вопрос по отдельному вопросу. У меня есть хостинг веб-сайтов, который помогает мне запустить веб-сайт учреждения.

  1. В моем приложении для Android должен быть такой вариант, как «Фотогалерея», в котором отображаются изображения с моего сайта (где я загружаю изображения в папку). Я думаю, что это можно сделать, управляя некоторыми файлами JSON.

  2. Пусть есть папка \ public_html \ MyApp \ Images, которая состоит из таких папок, как «Event1», «Event2» и т. Д. Я загружаю изображения в эти разные папки, и мое приложение для Android должно загружать их (возможно, отдельно предоставляя пользователям выбор для выбора папки).

Является ли это возможным? Если необходима какая-либо передовая система баз данных, пожалуйста, дайте мне несколько ссылок для этого. Есть ли способ создания JSON автоматически, содержащий ссылки на изображения?

Редактировать: Недавно я купил хостинг веб-сайтов для бэкэнда, и я не делал никаких серверных сценариев или чего-то еще. Вот почему требуется подробный ответ. Я не знаю, как управлять этими изображениями, просто загружать изображения и помещать ссылки в JSON или использовать некоторые MySQL, SQL или любые другие термины, которые я никогда не использовал.

Solutions Collecting From Web of "Загрузка большого количества изображений с сервера на Android"

По внешнему виду вам нужны две новые таблицы базы данных. Один для хранения ваших альбомов, а другой – для хранения отдельных изображений.

CREATE TABLE `album` ( `album_id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, `album_name` VARCHAR(255) NOT NULL, `album_date` DATE NOT NULL); 

album сохранит все метаданные альбома, чтобы он хранил Event1 со своими подробностями, Event2 и т. Д.

 CREATE TABLE `images` ( `image_id` INT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT, `album_id` INT(11) NOT NULL, `image_date` DATE NOT NULL, `image_path` VARCHAR(255) NOT NULL, FOREIGN KEY (album_id) REFERENCES album(album_id)); 

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

Ваши запросы для всех изображений будут

 SELECT * FROM `images`; 

Изображения из определенного альбома будут запрошены как

 SELECT * FROM `images` WHERE `album_id` = *YOUR_ID*; 

Результат SQL-запроса может быть закодирован JSON, используя

 json_encode($query_result); //PHP code 

EDIT : пример приложения Gallery в Android Hive

Похоже, что вы сохраняете изображения как BLOB непосредственно в базе данных, следовательно, это дает вам ограничение в 64 КБ. Лучше, если вы сохраните пути изображений. Если это невозможно, base64 кодирует изображения и сохраняет их в столбце типа VARCHAR.

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

Извините за плохой английский…

Эти изображения сохраняются как тип BLOB в вашей базе данных или вы сохраняете какую-то ссылку на него?

Вы можете отправить какой-то HTTP-запрос с именем папки, а затем создать json с данными изображений. Я использую Volley lib для HTTP-запросов в своем приложении, очень легко и хорошо работает

Да, вы действительно можете это сделать, это возможно, а также практично, так как у вас есть сервер. Первое, что нужно сделать, это сделать API с помощью этого api, вы можете создавать URL-адреса, которые андроид может извлекать из данных JSON из объектов, это также означает, что вам нужно преобразовать путь изображения в JSON. В этом замечательном учебном пособии объясняется все процесс и даже больше. Поскольку вы загружаете большое количество, я предлагаю вам использовать Picasso для кэширования изображений, а также просмотр ресайклеров

https://www.simplifiedcoding.net/android-programming-tutorial-to-get-all-images-from-server/

Счастливое кодирование!

Вы можете получить путь от всех изображений с сервера в JSON и отобразить изображения, пройдя путь с помощью библиотеки Picasso, как –

 Picasso.with(context).load("imagepath").into(imageView); 

Вы пытаетесь кодировать все изображения в base64, а затем вставлять в базу данных, а затем создавать api, которые извлекают все изображения из вашей базы данных, а затем синхронизируют ваше приложение Android с этим api и сохраняете изображения как sqlite в локальной базе данных. 1. Основная прибыль заключается в том, что теперь вы можете загружать свою галерею imges offline также

Тип blob может быть другим. С одной стороны он может означать тип sql blob . И самое главное – MIME-тип, как здесь

Если вы кодируете свой API / Backend в Java, это может выглядеть так, чтобы передать изображение клиенту, который запросил blob:

 public javax.ws.rs.core.Response exportBlob( String blobName ) throws Exception { Blob imageBlob = resultSet.getBlob(yourBlobColumnIndex); //query the blob from the Database String type = "image/png"; // Set your needed MIME Type StreamingOutput data = createStreamingOutput( imageBlob ); // stream it as a binary return Response.ok( data, type ).build(); } /** * Creates an Outputstream of the Data from the given Blob. * * @param blob the blob that needs to be converted. * @return Outputstream of the Blob Data. * @throws WebApplicationException when the conversion failed. */ private static StreamingOutput createStreamingOutput( final java.sql.Blob blob ) { return output -> { try ( InputStream stream = blob.getBinaryStream() ) { byte[] buff = new byte[4096]; int count; while ( ( count = stream.read( buff ) ) != -1 ) { if ( count > 0 ) { output.write( buff, 0, count ); } } } catch ( SQLException e ) { throw new WebApplicationException( e.getMessage(), e ); } }; } 

Преобразование его в Base64 также является опцией. Вы должны адаптироваться к тому, что вы можете использовать в android, чтобы снова преобразовать эту двоичную информацию обратно в изображение.

Примером для Android может быть следующее:

 //byteArray is what you recieved from the API in this example Bitmap bm = BitmapFactory.decodeByteArray(byteArray, 0 ,byteArray.length); 

РЕДАКТИРОВАТЬ:

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

  1. Как сохранить фактическое изображение в базе данных MySQL здесь (это не так отличается для других баз данных, помимо синтаксиса)
  2. Немного запутанный пример обработки BLOB на php здесь
  3. Пример использования BLOB в Java здесь

Часто есть вопросы об использовании BLOB для сохранения изображений. Вы могли бы сделать жизнь действительно очень простой, просто добавив представление base64 изображения в базу данных. Таким образом вам не нужно будет обрабатывать dataType BLOB. Однако я вообще не люблю это решение лично и предпочитаю использовать BLOB. (Я уже добавил статью о блобе, поэтому я больше не буду этого делать)

Также здесь есть некоторые ссылки для того, чтобы попасть в разработку Backend, но это та часть, в которой ваши собственные усилия встают на свои места. Это много, чтобы учиться, но не бойтесь. Как только вы закончите свою базу, это станет проще.

Java-платформы

Интересные PHP-платформы

Учебник PHP Backend

Онлайн-курс

Удачи вам в пути!

Этому решению не нужна база данных.

Вам нужны две конечные точки API в PHP

Загрузить изображения / api / upload

 <?php $target_dir = "uploads/"; $target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image if(isset($_POST["submit"])) { $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]); if($check !== false) { echo "File is an image - " . $check["mime"] . "."; $uploadOk = 1; } else { echo "File is not an image."; $uploadOk = 0; } } // Check if file already exists if (file_exists($target_file)) { echo "Sorry, file already exists."; $uploadOk = 0; } // Check file size if ($_FILES["fileToUpload"]["size"] > 500000) { echo "Sorry, your file is too large."; $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { echo "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { echo "Sorry, your file was not uploaded."; // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) { echo "The file ". basename( $_FILES["fileToUpload"]["name"]). " has been uploaded."; } else { echo "Sorry, there was an error uploading your file."; } } ?> 
  1. Список изображений

Сначала перечислите все каталоги в каталоге загрузки:

 $array = glob("uploads/*", GLOB_ONLYDIR); echo json_encode($array); 
  1. Если вы хотите создать определенную папку, вы можете сделать это, отправив имя папки и добавив URL-адрес запроса и список всех файлов.

    $ Array = glob ("uploads /".$_ REQUEST ['dir']." / * "); Echo json_encode ($ array);

РЕДАКТИРОВАТЬ

 // provides the current working directory echo getcwd() ."\r\n"; // then navigate to path // glob(getcwd() . DIRECTORY_OF_IMAGES)); // GLOB_BRACE tells to find all extensions in the brace $array = glob(getcwd() . "/web/bundles/img/*.{jpg,gif,png}", GLOB_BRACE); 

Прочтите эту статью http://php.net/manual/en/function.glob.php

См. «Если у вас есть хостинг-аккаунт хостинга, вы можете создать собственную базу данных, даже не написав одну строку кода mysql. Для серверной стороны вам необходимо изучить Php. Кроме того, никогда не рекомендуется хранить изображения в базе данных. Храните их в своем хранилище на своем хостинговом сайте и их ссылках (URL) в базе данных. Это ускорит выбор изображений.

Для стороны Android просто используйте библиотеку Picasso, которая экономит ваше время и пространство для загрузки изображений с сервера.

Вы все готовы пойти. 🙂 Комментарий для запросов.

Я советую вам рассмотреть эти два варианта для обслуживания и хранения файлов:

  1. Обзор API Blobstore для Java
  2. Хранилище Google Cloud

Я нашел решение сам. Это довольно легко понять и реализовать и требует знания только JSON. Во-первых, посмотрите это изображение из каталога моего веб-сайта:

Папки «event1», «event2» – это имена альбомов. Мы можем создать столько необходимых.

«Файл getfolders очень важен. Содержание:

 { "test":[ { "sub":"event1", "content":"https://i1.wp.com/www.downloadinformer.com/wp-content/uploads/2017/03/AMPFB.jpg?w=1366", "param":"1.php" }, { "sub":"event2", "content":"myimageurl", "param":"myphpfilenamewithextension" } ] } 

Здесь мы записываем имена альбомов, как вы можете видеть в поле «sub». Поле «content» содержит ссылку на миниатюру альбома, а «param» содержит имя соответствующего файла PHP. Не волнуйтесь, вам не нужно изучать PHP. Это готовый сценарий.

1.php

 <?php $indir = array_filter(scandir('event1'), function($item) { return $item[0] !== '.'; }); echo json_encode($indir); ?> 

Что делает этот PHP-файл? В нем перечислены все имена файлов, присутствующих в указанной папке. Как вы можете видеть, мы указали « event1 » как имя папки в этом файле PHP. Таким образом, он вернет имена всех изображений в формате JSON. Не забудьте указать этот файл PHP в поле «param» файла «getfolders».

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

Я сделал два занятия (не предпочитал фрагменты). Один, чтобы показать альбомы, а второй – показать изображения, присутствующие в нем.

Activity 1-> Parses getfolders file и извлекает альбомы, которые мы указали ранее.

Название альбома: подполе вышеупомянутого JSON, альбом Thumbnail: поле содержимого вышеупомянутого JSON, (Hidden From User) Список имен изображений: поле param

Таким образом, мы можем показать это в Recyclerview с этой информацией. Теперь мы указываем OnClickListener для своих элементов.

On Click Of Item-> Начать второе действие с помощью Intent и передать имя альбома, которое по сути является именем папки на нашем сервере. Таким образом, мы получаем доступ к папке, содержащей изображения. Также передайте значение поля «param». Это дает нам URL-адрес "www.mywebsite.com/…./alreadyspecifieddirectory/1.php"

Activity-> 2 Внедрите GridLayoutManager, чтобы показывать фотографии пользователю. getIntent() ранее переданные значения с помощью getIntent() . Сначала нам нужно выполнить этот файл PHP и проанализировать содержимое JSON. Вот какой код:

  private void loadJSON(){ StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_DATA, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONObject jsonObject = new JSONObject(response); for (int i=2; i<jsonObject.length()+2;i++){ String value =jsonObject.getString(String.valueOf(i)); if (value.length()!=0) { ListItem item = new ListItem(value, mParam1+"/"+value, "nothing"); listItems.add(item); } } adapter = new PhotoLibraryAdapter(Photos.this,listItems,photosList,true); photosList.setAdapter(adapter); progressBar.setVisibility(View.GONE); } catch (Exception e) {progressBar.setVisibility(View.GONE);} } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { progressBar.setVisibility(View.GONE); } }); RequestQueue requestQueue = Volley.newRequestQueue(this); requestQueue.add(stringRequest); } 

Обратите внимание, что мы начали цикл из 2, потому что PHP-файл возвращает значения из индекса 2, потому что значение 0 и значение 1 являются значениями отходов и называются «.». И ".." соответственно.

Следовательно, мы получаем имена изображений, которые мы можем передать с URL-адресом: «www.mywebsite.com/…/albumnameretrievedearlier/imagenamegivenbyPHPfile»

И передать его адаптеру, чтобы мы могли загружать изображения с помощью библиотеки Picasso.

Это оно! Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать в комментариях.

EDIT 1: Вот как это выглядит: