Intereting Posts
Активность Android Refresh при возврате на него Как получить полные данные cookie из Android WebView? Отображение индикатора выполнения в диалоговом окне предупреждения Android: как увеличить размер кучи во время выполнения? 2 кнопки бок о бок – макеты андроидов Почему EditText в пользовательском составном представлении повторно использует текст, введенный в другой составной экземпляр вида? Ошибка сборки после перехода с SDK на Crashlytics на Fabric Перезагрузка телефона Получить значение даты и времени из одного фрагмента диалога и установить его в EditText Обновление SDK для Android: установите последнюю платформу для реализации новых API, таких как «ShortcutManager», Gson – прочитать значение с двумя разными ключами Что такое Android Native Development Kit (NDK)? Не удалось решить: com.android.support:appcompat-v7 24.0.1 Панель действий вверх с фрагментами Как показать значки в меню переполнения в ActionBar

Как использовать BLOB с JSON и PHP?

У меня есть удаленная база данных с MySQL, и я храню фотографии пользователей моего приложения в базе данных как строку базы данных с типом LONGTEXT.

Я преобразовываю фотографии в строку с Base64.

Я подключаюсь к своей удаленной базе данных с JSON и PHP, потому что это, я должен использовать Base64, потому что, как я знаю, JSON и PHP должны отправлять строки по параметрам, а с Base64 я могу преобразовать фотографию в строку.

Он работает нормально, но он очень медленный. Когда я загружаю фотографию в 100 КБ, это занимает много времени, но когда я загружаю фотографию размером 5 КБ, она занимает всего две или три секунды.

Друг сказал мне использовать BLOB вместо Base64, но как я могу использовать BLOB с JSON и PHP-соединение с базой данных? Кроме того, мне нужно сохранить изображения в строке таблицы USER . Это связано с тем, что у пользователей нет привилегий для загрузки файлов на удаленный сервер, но они могут загружать фотографии, загружая их в виде строки в строке таблицы USER .

благодаря

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

Это код, где требуется ожидание времени ожидания (он ждет в строке: while ((line = reader.readLine()) != null) { , он ждет на reader.readLine() )

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

 public Friend RetrieveOneUser(String email) { Friend friend=null; String result = ""; //the parameter data to send ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); nameValuePairs.add(new BasicNameValuePair("email",email)); //http post InputStream is=null; try{ HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(this.BaseURL + this.GetOneUser_URL); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); }catch(Exception e){ Log.e("log_tag", "Error in http connection "+e.toString()); } //convert response to string try{ BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } is.close(); result=sb.toString(); }catch(Exception e){ Log.e("log_tag", "Error converting result "+e.toString()); } //parse json data try{ JSONArray jArray = new JSONArray(result); for(int i=0;i<jArray.length();i++) { JSONObject json_data = jArray.getJSONObject(i); friend=new Friend(json_data.getString("email"),json_data.getString("password"), json_data.getString("fullName"), json_data.getString("mobilePhone"), json_data.getString("mobileOperatingSystem"),"",json_data.getString("photo")); } } catch(JSONException e){ Log.e("log_tag", "Error parsing data "+e.toString()); } return friend; } 

Solutions Collecting From Web of "Как использовать BLOB с JSON и PHP?"

Разделите запрос на две части:

  • Сначала загружает JSON со всем, кроме изображения, возвращает ссылку на изображение как URL вместо
  • Вторая загрузка изображения в виде бинарного фрагмента, потенциально асинхронно в зависимости от приложения

Я предполагаю, что у вас есть что-то вроде http://example.com/userinfo/xxx в качестве конечной точки, которая возвращает JSON? Добавьте конечную точку, такую ​​как http://example.com/userinfo_image/xxx, чтобы вернуть только изображение, тогда вы можете вернуть ее как бинарный фрагмент вместо Base64, кодирующий его в JSON.

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

Для получения информации о ленивых загрузках изображений в фоновом режиме см. Сообщение в блоге разработчиков Android для примера:

http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

Если вы не можете лениться загрузить изображение, рассмотрите параллельные запросы как для изображения, так и для JSON одновременно. Поскольку двоичная версия изображения имеет намного меньшую пропускную способность сети и намного меньше обработки, как только вы получаете данные на телефоне, она все равно должна казаться намного более быстрой.

Почему бы не сбросить изображение в виде файла на сервере и не вернуть URL-адрес написанного файла в json? Это действительно то, как вы должны делать то, что хотите, поскольку http – это протокол, который вы должны использовать для передачи изображений через Интернет.

Код, подобный этому, должен делать то, что вы хотите на сервере

  //code to get your row from database //Code that writes it to a file. $Data = $row['myblobfield']; $fp = fopen('myimgname.jpg', 'w'); fwrite($fp, $Data); fclose($fp); 

Это запишет ваши поля blob или longtext в виде файла на вашем сервере, который вы затем сможете загрузить из своего мобильного приложения. После этого вы можете удалить эти временные файлы.

Надеюсь, это полезно

Чтобы ответить на ваш вопрос: Нет, JSON не поддерживает двоичные данные, вы должны каким-то образом избежать этого, прежде чем отправлять его. Хранение его, поскольку BLOB в MySQL не собирается исправлять основные проблемы инфраструктуры, которые у вас есть.

Насколько я понимаю, у вас есть устройство Android, которое загружает изображение на сервер PHP, этот PHP-сервер кодирует изображение на Base64, помещая его в строку JSON, а затем отправляя на удаленный (как удаленный удаленный? По всему миру? По всему миру? В космическом пространстве, вращающемся вокруг Луны?) MySQL-сервер через какой-то HTTP-интерфейс, что сервер MySQL хранит изображение Base64 как LONGTEXT. Чтобы вернуть изображение, клиент Android отправляет запрос на PHP, PHP отправляет запрос на удаленный сервер MySQL, затем PHP должен декодировать изображение Base64 и отправлять его.

Это ужасно неэффективно, вы будете испытывать латентность на каждом шагу.

Редактирование: хорошо, похоже, что это проблема на стороне клиента, а не проблема на стороне сервера …

Если это так, я бы предложил проверить сообщения @ Загрузка изображений на PHP-сервер с Android, поскольку у них должны быть более эффективные примеры.

Является ли медленность, исходящая из json / base64, кодирующей 100 тыс. Данных, или из базы данных? Вероятно, из кодировки, и помещая файлы в файловую систему (как все в комментариях плачут), в небольших масштабах не будет иметь особого значения.

Проведите некоторые измерения в разных частях операции и попытайтесь определить, почему она медленная. Я не знаю, как еще вы получите изображение blob в json закодированную строку без base64, я полагаю, вы могли бы попытаться избежать всего, что может быть столь же медленным, и надеемся, что парсер не задушит его.

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