Php blob to json

Возвращение blob с json

Я пытаюсь создать службу отдыха для своего приложения для Android, где внешняя база данных возвращает элементы, которые будут храниться в локальной базе данных приложений. У меня есть все, кроме blobs, которые возвращаются как null.

это пример моего ответа Джейсона (картинки и миниатюры – это капли)

Вот мой PHP-скрипт для возврата данных.

php require_once('config.php'); $mysqli = new mysqli(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME); $sql = 'select * from spot_main'; $results =$mysqli->query($sql); $spots = array(); //array to parse jason from while($spot = $results->fetch_assoc()) < $spots[] = $spot; >echo json_encode($spots); ?> 

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

Кодируйте двоичные данные как base64, прежде чем создавать JSON.

$obj->picture = base64_encode($binaryData); 

Затем вы можете декодировать это в своем приложении Android с любым базовым 64-декодером. Начиная с уровня API 8, существует встроенный класс util . В противном случае существует множество внешних библиотек, которые вы можете использовать для Android 2.1 или более ранних версий.

вам нужно сделать BLOB для base64_encode

 while($spot = $results->fetch_assoc())

Затем подготовьте петлю foreach как это

foreach($spots as $key=>$value) < $newArrData[$key] = $spots[$key]; $newArrData[$key]['picture'] = base64_encode($spots[$key]['picture']); $newArrData[$key]['thumbnail'] = base64_encode($spots[$key]['thumbnail']); >header('Content-type: application/json'); echo json_encode($newArrData); 

Кажется, что json_encode работает только с кодированными данными UTF-8. Вы можете использовать json_last_error () для обнаружения ошибки json_encode.

Источник

Как использовать 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 ArrayListnameValuePairs = new ArrayList(); 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> catch(JSONException e) < Log.e("log_tag", "Error parsing data "+e.toString()); >return friend; > 

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

  • Сначала загружает JSON со всем, кроме изображения, вместо этого возвращает ссылку на изображение как URL-адрес
  • Второе загрузите изображение в виде бинарного фрагмента, потенциально асинхронно в зависимости от приложения.
Читайте также:  На чем пишется php

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

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

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

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

Читайте также:  Python sum two strings

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

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

Источник

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

У меня есть удаленная база данных с MySQL, и я храню фотографии пользователей моего приложения в базе данных как строку базы данных с типом LONGTEXT. Я преобразую фотографии в строку с Base64. Я подключаюсь к своей удаленной базе данных с помощью JSON и PHP, потому что это, я должен использовать Base64, потому что, как я знаю, JSON и PHP должны отправлять строки по параметрам, а с Base64 я могу преобразовать фотографию в строку. Он работает нормально, но он очень медленный. Когда я загружаю фотографию в 100 КБ, это занимает много времени, но когда я загружаю фотографию размером 5 КБ, она занимает всего две или три секунды. Друг сказал мне использовать BLOB вместо Base64, но как я могу использовать BLOB с JSON и PHP-соединение с базой данных? Кроме того, мне нужно сохранить изображения в строке таблицы USER . Это связано с тем, что у пользователей нет привилегий для загрузки файлов на удаленный сервер, но они могут загружать фотографии, загружая их в виде строки в строке таблицы USER . спасибо EDIT: это код, в котором требуется ожидание времени ожидания (он ждет в строке: while ((line = reader.readLine()) != null) < , он ждет на reader.readLine() ) этот код получает одного пользователя из удаленной базы данных, ему требуется loooooot времени, чтобы показать пользователя в моем приложении

public Friend RetrieveOneUser(String email) < Friend friend=null; String result = ""; //the parameter data to send ArrayListnameValuePairs = new ArrayList(); 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> catch(JSONException e) < Log.e("log_tag", "Error parsing data "+e.toString()); >return friend; > 

Хранение самих изображений в базе данных (а не просто сохранение ссылки на файл в удаленной файловой системе), вероятно, является плохим шагом. Существует очень хороший существующий вопрос, который подробно рассматривает эту тему: Хранение изображений в БД — да или нет?

Я не могу сохранить ссылку на файл в удаленной файловой системе, потому что ПОЛЬЗОВАТЕЛИ ПРИЛОЖЕНИЯ не могут загружать фотографии в удаленную систему . Я сказал это в своем вопросе: «Почему кто-то проголосовал против меня? ?

+1 Это все еще законный вопрос, согласны ли вы с ним хранить фотографии в базе данных, не имеет значения.

Ваша настройка кажется очень неэффективной, поэтому, вероятно, она такая медленная. Почему вы не можете сохранить в файловую систему, а затем сохранить имя файла в базе данных? Вы можете использовать стандартный HTTP Upload для этой переменной & PHP $ _FILES. Много полезных ссылок здесь: stackoverflow.com/questions/2544517/…

Читайте также:  Python convert timezone to utc

Источник

How to use BLOB with JSON and PHP?

I’m assuming you have something like http://example.com/userinfo/xxx as an endpoint that returns the JSON? Add an endpoint like http://example.com/userinfo_image/xxx to return just the image, then you can return it as a binary chunk instead of Base64 encoding it in the JSON.

It means you make two HTTP requests instead of one, but depending on the app you might be able to do the image load asynchronously, and if so you normally get a big gain in perceived application response time from the users perspective.

For info about lazy loading images in the background see the post on the Android Developers blog for a sample:

If you can’t lazy load the image consider doing parallel requests for both the image and the JSON at the same time. With the binary version of the image taking a lot less network bandwidth, and a lot less processing once you get the data onto the handset, it should still seem a lot more speedy.

Why not dump your image as a file on the server and return the url of the written file in your json? This is really how you should do what you want to do since http is the protocol you should use for transfering images over the web.

Code similar to this should do what you want on the server

 //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); 

This will write your blob or longtext fields as a file on your server which you can then download from your mobile app. You can then delete this temp files after an interval.

To answer your question:No, JSON doesn’t support binary data, you must escape it in some way before sending it. Storing it as BLOB in MySQL is not going to fix the major infrastructure issues you have.

From what I understand you have an Android device that is uploading a picture to a PHP server, this PHP server is encoding the picture to Base64, putting that into a JSON string and then posting it to a remote(how remote is remote? same data center? across the country? across the world? in outer space orbiting the moon?) MySQL server through an HTTP interface of some sort, that MySQL server is storing the Base64 image as LONGTEXT. To get the image back, the Android Client sends a request to PHP, PHP sends a request to the remote MySQL server, PHP then has to Base64 decode the image and send it down.

This is horribly inefficient, you are going to suffer latency every step of the way.

Edit: okay it looks like this is a client side issue and not a server side issue.

If that’s the case then I’d suggest checking the posts @ Uploading images to a PHP server from Android as they should have some more efficient examples.

Источник

Оцените статью