Comment utiliser BLOB JSON et PHP?
J'ai une base de données distante avec MySQL, et je suis le stockage de photos des utilisateurs de mon application sur la base de données en ligne de la base de données avec LONGTEXT type.
Je transforme les photos d'une chaîne Base64.
- Je me connecter à ma base de données distante avec JSON et PHP, parce que cela, je dois utiliser Base64, parce que je sais, JSON et besoin de PHP pour envoyer des chaînes sur les paramètres, et avec Base64 je peux transformer la photo en string.
Il fonctionne ok, mais c'est très lent. Quand je suis le chargement d'une photo de 100 KO, il faut beaucoup de temps, mais quand je suis le chargement d'une photo de 5 KO il ne faut que deux ou trois secondes.
Un ami m'a dit d'utiliser BLOB au lieu de Base64, mais comment puis-je utiliser BLOB JSON et un PHP de connexion à la base de données? Aussi, j'ai besoin de stocker les images sur une ligne de la table USER
. C'est parce que les utilisateurs n'ont pas de privilèges pour télécharger des fichiers sur le serveur distant, mais ils peuvent télécharger des photos en les téléchargeant comme une chaîne de caractères dans une ligne de la table USER
.
grâce
EDIT:
c'est le code où il prend un looot temps d'attente (il attend dans la ligne: while ((line = reader.readLine()) != null) {
, il est en attente sur reader.readLine()
)
ce code obtient un utilisateur de la base de données distante, il faut un loooooot de temps pour montrer à l'utilisateur sur mon app
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;
}
je ne peux pas stocker une référence à un fichier dans la distance filesistem parce que les UTILISATEURS de l'APPLICATION peuvent pas télécharger des photos dans la télécommande sistem..... je l'ai dit dans ma question ¿pourquoi quelqu'un m'a mis un vote négatif??
pourquoi on ne peut pas les utilisateurs de télécharger des photos sur le système?
+1 c'est toujours une question légitime, si oui ou non vous êtes d'accord avec lui, le stockage des photos dans la base de données n'est pas pertinent.
Votre installation semble très inefficace, ce qui est probablement pourquoi c'est si lent. Pourquoi ne pouvez-vous pas enregistrer le fichier, puis enregistrez le nom de fichier dans la base de données? Vous pouvez utiliser le standard HTTP de Téléchargement pour cette & PHP $_FILES variable. Beaucoup de liens utiles ici: stackoverflow.com/questions/2544517/...
OriginalL'auteur NullPointerException | 2011-01-31
Vous devez vous connecter pour publier un commentaire.
Segment de la demande en deux parties:
Je suis en supposant que vous avez quelque chose comme http://example.com/userinfo/xxx comme un point de terminaison qui renvoie le JSON? Ajouter un point comme http://example.com/userinfo_image/xxx pour revenir à l'image, alors vous pouvez le retourner comme un binaire morceau au lieu de l'encodage Base64 dans le JSON.
Cela signifie que vous faire deux requêtes HTTP au lieu d'un seul, mais en fonction de l'application, vous pouvez être capable d'effectuer le chargement de l'image en mode asynchrone, et si oui, normalement, vous obtenez un grand gain de la perception de temps de réponse des applications à partir du point de vue utilisateur.
Pour plus d'informations sur le chargement différé des images en arrière-plan, voir le post sur les Développeurs Android blog pour un échantillon:
http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
Si vous ne pouvez pas paresseux charger l'image envisager de faire des demandes parallèles pour à la fois l'image et le JSON en même temps. Avec la version binaire de l'image en prenant beaucoup moins de bande passante réseau, et beaucoup moins de traitement une fois que vous obtenez les données sur le combiné, il devrait encore semblent beaucoup plus rapide.
OriginalL'auteur mikerowehl
Pourquoi ne pas faire un dump de votre image dans un fichier sur le serveur et retourne l'url du fichier écrit dans votre json? C'est vraiment la façon dont vous devriez faire ce que vous voulez faire depuis le http est le protocole à utiliser pour le transfert d'images sur le web.
Code similaire à ce qui devrait faire ce que vous voulez sur le serveur
Cela permettra d'écrire votre blob ou longtext champs dans un fichier sur votre serveur et vous pouvez ensuite les télécharger à partir de votre application mobile. Vous pouvez ensuite supprimer ce temp fichiers après un intervalle.
Espère que cela est utile
OriginalL'auteur Toby Allen
Pour répondre à votre question:
Non, JSON ne prend pas en charge les données binaires, vous devez vous échapper d'une certaine façon avant de l'envoyer. Stockage comme BLOB dans MySQL ne va pas résoudre les grands problèmes de l'infrastructure que vous avez.
De ce que je comprends vous avez un appareil Android est le téléchargement d'une image à un serveur PHP, ce serveur PHP est de codage de l'image en Base64, en le plaçant dans une chaîne JSON, puis l'affichage distant(comment remote est une télécommande à distance? même centre de données? à travers le pays? à travers le monde? dans l'espace en orbite autour de la lune?) Serveur MySQL via une interface HTTP de quelque sorte, que le serveur MySQL est le stockage de l'image en Base64 comme LONGTEXT. Pour obtenir l'image en arrière, les Android Client envoie une demande à PHP, PHP envoie une requête au serveur MySQL, PHP alors Base64 décoder l'image et de l'envoyer vers le bas.
C'est horriblement inefficace, vous allez souffrir de latence à chaque étape du chemin.
Edit: bon il semble que ce est un problème et non sur un serveur à côté...
Si c'est le cas, alors je vous suggère de vérifier les posts de @ Télécharger des images vers un serveur PHP à partir d'Android qu'ils devraient avoir un peu plus efficace des exemples.
OriginalL'auteur Klinky
Est la lenteur à venir à partir de json/encodage base64 100K de données, ou à partir de la base de données? C'est probablement à partir de l'encodage, et de mettre les fichiers dans le système de fichiers (comme tout le monde dans les commentaires pleure), sur une petite échelle, ne va pas faire un peu de différence.
Faire quelques mesures sur les différentes parties de l'opération, et d'essayer de cerner le pourquoi de sa lenteur. Je ne sais pas de quelle autre manière, vous obtiendrez une image blob dans une chaîne encodée json sans base64, je suppose que vous pourriez tenter de s'échapper de tout, qui pourrait être aussi lent, et espérons que l'analyseur ne s'étouffe.
Êtes-vous à l'aide de la fonction json_encode en php, ou manuellement la construction de la chaîne? Essayez de construire manuellement. Êtes-vous de l'encodage base64 données brutes de la base de données, ou est-il codé avant sa stockées, vous devez encoder avant sa stockées pour gagner du temps lors de la sortie.
Si la lenteur est sur le côté client? Toute la question de mysql et php, ce qui aurait probablement été laissé hors de la question, et les gens pourraient avoir répondu plus au lieu de se concentrer sur la mauvaise chose. Ne peut pas vous aider là-bas.
OriginalL'auteur profitphp