Как использовать 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; } 

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

  • Сначала загружает 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, кодирующей 100K данных, или из базы данных? Скорее всего, из кодировки и помещая файлы в файловую систему (как все в комментариях плачут), в небольших масштабах, не будет иметь большого значения.

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

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