Autore Topic: Leggere/Scrivere in Blob Field  (Letto 480 volte)

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Leggere/Scrivere in Blob Field
« il: 05 Aprile 2016, 12:57:34 CEST »
0
Ciao ragazzi
la mia applicazione ha un db mysql remoto con una tabella molto semplice fatta da 2 colonne: id(int), immagine(blob)
ora, riesco a scaricare le immagini, ma non riesco a salvarla nel file.
Per scaricarla faccio una chiamata http e riempio l'immageView cosi:
Codice: [Seleziona]
public  static void  DoQryFoto(final Context cont , final SharedPreferences sharedPref, String fields, String tableName, String whereClause, final ImageView img)
        {
                 RequestParams params = new RequestParams();
                //*** istanza del client ***
                 AsyncHttpClient client = new AsyncHttpClient();
                 int IdUte =sharedPref.getInt("IdUte", 0);       
                 String url = "http://miosito.org/yyy/selectParamLogo.php?Fields=" + fields + "&TableName=" + tableName + "&WhereClause=" + whereClause +  "&IdUte=" + IdUte;
                 client.get(url, params,new JsonHttpResponseHandler()
               {
              @Override
                 public void onSuccess(int statusCode, Header[] headers, JSONObject response)
                {
                             Toast.makeText(cont, "JSonObj Response" , Toast.LENGTH_SHORT).show();       
                      }
                                                    @Override
                                                   public void onSuccess(int statusCode, Header[] headers, JSONArray dati)
                                                   {
                                                                        JSONObject ooo;
                                                                        try
                                                                        {
                                                                                ooo = dati.getJSONObject(0);
                                                                                String blob = ooo.getString("immagine");
                                                                                byte[] decodedString = Base64.decode(blob, Base64.DEFAULT);
                                                                                Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length);
                                                                                img.setImageBitmap(decodedByte);
                                                                        }
                                                                        catch (JSONException e) {
                                                                                e.printStackTrace();
                                                                        }
                                                                         
                                                     }
                                                    @Override
                                                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse)
                                                    {
                                                                                Toast.makeText(cont, "Server non raggiungibile ", Toast.LENGTH_SHORT).show();       
                                                    }
                                                    @Override
                                                    public void onFailure(int statusCode, Header[] headers, String responseString,Throwable throwable)
                                                    {
                                                                    String help="Errore dal server: ";
                                                                Toast.makeText(cont, help + statusCode, Toast.LENGTH_SHORT).show();
                                                    }
                                          });
        }

nella mia pagina php ho:
Codice: [Seleziona]
<?php
header('content-type: application/json; charset=UTF-8; Accept:application/json; Accept-Language:it-IT');
mysql_connect("xx.yyy.zzz.190","Sqlxxxxx","xxxxxxxx");
mysql_select_db("xxxxxxx");

$TableName= $_GET['TableName'];
$Fields= $_GET['Fields'];

$WhereClause= $_GET['WhereClause'];

$help = urldecode($WhereClause);

$q=mysql_query("SELECT ".$Fields." FROM ".$TableName.$help);
while($e=mysql_fetch_assoc($q))
{
            $encodedArray = array_map(base64_encode, $e);
        $output[]=$encodedArray;
}
print(json_encode($output));
mysql_close();
?>
E tutto questo funziona perfettamente!.
poi però devo anche salavrla questa immagine ed ho fatto:
Codice: [Seleziona]
public  static void  DoQryAggFoto(final Context cont , final SharedPreferences sharedPref,   final ImageView img)
        {
                 RequestParams params = new RequestParams();
                //*** istanza del client ***
                 AsyncHttpClient client = new AsyncHttpClient();
                 int IdUte =sharedPref.getInt("IdUte", 0);       

                        Bitmap bitmapImg = ((BitmapDrawable)img.getDrawable()).getBitmap();
                        ByteArrayOutputStream bos = new ByteArrayOutputStream();
                        bitmapImg.compress(Bitmap.CompressFormat.PNG, 100, bos);
                        byte[] bArray = bos.toByteArray();
                        String  imageString = Base64.encodeToString(bArray, Base64.URL_SAFE );

                String url = "http://xxxx.org/yyyyy/updateParamFoto.php?Immagine=" + imageString +
                                    "&IdUte=" + IdUte;
                 client.get(url, params,new JsonHttpResponseHandler()
                                                           {
                                                                @Override
                                                    public void onSuccess(int statusCode, Header[] headers, JSONObject response)
                                                    {
                                                            Toast.makeText(cont, "JSonObj Response" , Toast.LENGTH_SHORT).show();       
                                                    }
                                                                @Override
                                                    public void onSuccess(int statusCode, Header[] headers, JSONArray dati)
                                                    {
                                                                        Toast.makeText(cont, "Fatto !!! ", Toast.LENGTH_SHORT).show();       
                                                     }
                                                                @Override
                                                    public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse)
                                                    {
                                                                                Toast.makeText(cont, "Server non raggiungibile ", Toast.LENGTH_SHORT).show();       
                                                    }
                                                                @Override
                                                    public void onFailure(int statusCode, Header[] headers, String responseString,Throwable throwable)
                                                    {
                                                                    String help="Errore dal server: ";
                                                                                Toast.makeText(cont, help + statusCode, Toast.LENGTH_SHORT).show();
                                                    }
                                          });
        }
chiamando il seguente php:
Codice: [Seleziona]
<?php
header('content-type: application/json; charset=UTF-8; Accept:application/json; Accept-Language:it-IT');
mysql_connect("xxxxx.yyyy.zzzz.190","xxxxxx","yyyyyy");
mysql_select_db("xxxxxxxx");

$immagine = urldecode($_GET['Immagine']);

$idute = $_GET['IdUte'];

$q=mysql_query("UPDATE utenti set immagine = '". mysql_real_escape_string($immagine)."' where id = ".$idute);

$result=mysql_query($q) or die(mysql_error());
if (!$result)
   {
                $arr = array('messaggio' => 'Errore in inserimento');
                print(json_encode($arr));
                die("Errore nella query1: ".$prova);
   }
   else       
   {
                $arr = array('messaggio' => 'Record aggiornato');
                print(json_encode($arr));
   }
mysql_close();
?>
Nel campo Blob mi trovo una stringa lunghissima di caratteri che non sono più l'immagine che ho tentato di spedire, infatti dopo 'l'aggiornamento del campo blob' l'immagine che c'era prima va persa.
NN so esattamente dove stia l'errore: nel codice java o nel php? o in entrambi sto sbagliando?
qualcuno ha gia fatto qualcosa del genere.
grazie mille
Nicola

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Leggere/Scrivere in Blob Field
« Risposta #1 il: 05 Aprile 2016, 13:25:48 CEST »
0
Non lo so. Non ho mai capito l'utilità di salvare immagini direttamente in un DB. Nel le momento che butto 1000 immagini il DB occupa almeno 1000 mega.
Ritengo appropriato salvare il percorso della foto e memorizzarla su FTP o altro

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Leggere/Scrivere in Blob Field
« Risposta #2 il: 05 Aprile 2016, 15:16:23 CEST »
0
NN è un archivio DB di massa, vi memorizzo li utenti con un immagini molto piccole tipo icone, lo trovo molto comodo e inoltre le immagini non sono cosi facilmente visualizzabili come su cartelle di server ftp.
Nn mi sembra cosi sbagliato, ovviamente qualora (magari) avessi migliaia e migliai di utenti penserei ad una soluzione con cartelle e path dei files memorizzati in queste.

Offline tonno16

  • Utente storico
  • *****
  • Post: 1184
  • Respect: +57
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Leggere/Scrivere in Blob Field
« Risposta #3 il: 05 Aprile 2016, 16:36:38 CEST »
0
Allora quando fai Select * fai attenzione e non mettere il * altrimenti tiri giù mega

Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Leggere/Scrivere in Blob Field
« Risposta #4 il: 05 Aprile 2016, 17:04:53 CEST »
0
Si si, ma infatti la select funziona poichè anche se vedi una variabile uso solo un campo ('immagine'), ma il mio problema è sull'update che proprio non mi riesce...ho appena modificato il php così...ho aggiunto il comando base64_decode...ma nn aggiorna nulla...
Codice: [Seleziona]
$immagine = urldecode($_GET['Immagine']);

$idute = $_GET['IdUte'];
$prova = base64_decode($immagine);

$q=mysql_query("UPDATE utenti set immagine = "$prova." where id = ".$idute);


Offline nicozumel

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +4
    • Mostra profilo
  • Dispositivo Android:
    Huawei - P7
  • Sistema operativo:
    Windows 7
Re:Leggere/Scrivere in Blob Field
« Risposta #5 il: 11 Aprile 2016, 23:10:18 CEST »
+1
Ciao
 voglio condividere con voi la soluzione che ho trovato dopo qualche giorno di sbattimento:...
nel codice java il seguente:
Codice: [Seleziona]
//*** istanza del client ***
                 AsyncHttpClient client = new AsyncHttpClient();

                int IdUte =sharedPref.getInt("IdUte", 0);       
                // Preparo l'immagine da salvare
                Bitmap bitmapImg = ((BitmapDrawable)img.getDrawable()).getBitmap();
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                bitmapImg.compress(Bitmap.CompressFormat.PNG, 100, bos);
                byte[] bArray = bos.toByteArray();
                String imageString = new String(Base64.encode(bArray,Base64.DEFAULT));
                       
                String url = "http://abc.com/yyy/zzz.php?Immagine=" + imageString +
                                    "&IdUte=" + IdUte;
                client.get(url, params, new JsonHttpResponseHandler()
                                                           {
                                                                @Override
                                                    public void onSuccess(int statusCode, Header[] headers, JSONObject response)
                                                    {
                                                                   // If the response is JSONObject instead of expected JSONArray
                                                            Toast.makeText(cont, "JSonObj Response ok" , Toast.LENGTH_SHORT).show();       
                                                    }
etc...
ma il vero problema era nel codice php e le 3 funzioni chiave da utilizzare sono nell' ordine urldecode/ base64_decode e  mysql_real_escape_string:
Codice: [Seleziona]
<?php
header('content-type: application/json; charset=UTF-8; Accept:application/json; Accept-Language:it-IT');
mysql_connect("111.222.333.444","user","pwd");
mysql_select_db("dbname");

$immagine = urldecode($_GET['Immagine']);

$idute = $_GET['IdUte'];

$buffer = base64_decode($immagine);
$buffer = mysql_real_escape_string($buffer);

$sql = "UPDATE utenti SET immagine = '$buffer' WHERE id = '$idute'";
$result=mysql_query($sql);
if (!$result)
   {
                $arr = array('messaggio' => 'Errore in inserimento');
                print(json_encode($arr));
                die("Errore nella query: ");
   }
   else       
   {
                $arr = array('messaggio' => 'Record aggiornato');
                print(json_encode($arr));
   }
mysql_close();
?>
...bene e con questo l'aggiornamento di un campo blob del db viene correttamente eseguito
grazie