Convert string to blob and save to bank

3

I'm developing a mobile application that has a form where the user can attach an image, the image is being sent as a string via rest to the server and saved in the blob-type database, however, I'm having trouble converting from string to blob from the side of my api.

Capturing application image via camera:

public void tirarFoto(View view){
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    startActivityForResult(intent, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    if(data != null){
        Bundle bundle = data.getExtras();
        if(bundle != null){
            Bitmap img = (Bitmap) bundle.get("data");
            Toast toast = Toast.makeText(getApplicationContext(), "Foto anexada", Toast.LENGTH_LONG);
            toast.show();
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            img.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            foto = Base64.encodeToString(stream.toByteArray(), Base64.DEFAULT);

        }
    }
}

Sending to my API:

public void registerForms() {

    final String address = frua.getText().toString().trim();
    final String district = fbairro.getText().toString().trim();
    final String city = fcidade.getText().toString().trim();
    final String email = femail.getText().toString().trim();
    final String complement = fcompl.getText().toString().trim();
    final String state = festado.getText().toString().trim();
    final String note = fobs.getText().toString().trim();
    final String countries = fpais.getText().toString().trim();
    progressDialog = ProgressDialog.show(DenunciaActivity.this, "Aguarde um momento", "Enviando...", true, false);

    StringRequest stringRequest = new StringRequest( Request.Method.POST, REGISTER_URL, new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {

            if (response.contains("Erro")) {
                progressDialog.dismiss();
                Toast.makeText( DenunciaActivity.this, "Erro ao enviar", Toast.LENGTH_LONG ).show();

            } else {
                progressDialog.dismiss();
                Intent intent = new Intent(DenunciaActivity.this, MainActivity.class);
                Toast.makeText( DenunciaActivity.this, "Enviado com sucesso!", Toast.LENGTH_LONG ).show();
                startActivity(intent);
            }

        }
    },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressDialog.dismiss();
                    Toast.makeText( DenunciaActivity.this, error.toString(), Toast.LENGTH_LONG ).show();
                    Log.i( TAG, "Lat: " + error );
                }
            } ) {
        @Override
        protected Map<String, String> getParams() {
            Map<String, String> map = new HashMap<String, String>();
            map.put( KEY_USERNAME, name );
            map.put( KEY_DATE, dataFormatada );
            map.put( KEY_STATE, state );
            map.put( KEY_CITY, city );
            map.put( KEY_DISTRICT, district );
            map.put( KEY_ADDRESS, address );
            map.put( KEY_EMAIL, email );
            map.put( KEY_COMPLEMENT, complement );
            map.put( KEY_COUNTRIE, countries );
            map.put( KEY_LAT, String.valueOf( latitude ) );
            map.put( KEY_LONG, String.valueOf( longitude ) );
            map.put( KEY_NOTE, note );
            map.put( KEY_STATUS, "ATIVO" );
            map.put( KEY_IMAGE, foto );
            Log.i( TAG, "Lat: " + longitude +" "+latitude);
            return map;
        }

    };

    RequestQueue requestQueue = Volley.newRequestQueue( this );
    requestQueue.add( stringRequest );
}

My API:

public class Services extends Controller {

public static void denuncia(@Valid String nome, String data, String rua, String bairro, String complemento,
        String cidade, String estado, String pais, String observacao, String email, String latitude,
        String longitude, Status status, String foto) {
    if (validation.hasErrors()) {
        String mensagem = "Erro ao cadastrar";
        JsonObject j = new JsonObject();
        j.addProperty("Erro", 404);
        j.addProperty("msg", mensagem);
        renderJSON(j);
    } else {
        byte[] decodedBytes = Base64.decodeBase64(foto);
        String msgsucess = "Cadastrado com sucesso!";
        Denuncia denuncia = new Denuncia();
        denuncia.nome = nome;
        denuncia.data = data;
        denuncia.rua = rua;
        denuncia.bairro = bairro;
        denuncia.complemento = complemento;
        denuncia.cidade = cidade;
        denuncia.estado = estado;
        denuncia.pais = pais;
        denuncia.observacao = observacao;
        denuncia.email = email;
        denuncia.latitude = latitude;
        denuncia.longitude = longitude;
        denuncia.status = status;
        if(foto == null) {
            denuncia.foto = null;
        }else {
            denuncia.foto = decodedBytes;
        }
        denuncia.save();
        JsonObject j = new JsonObject();
        j.addProperty("Success", 200);
        j.addProperty("msg", msgsucess);
        renderJSON(j);
    }
}
}

My model:

public Blob foto;
    
asked by anonymous 11.01.2018 / 16:47

3 answers

0

A blob actually for the database is a byte [], so as the information traffic was done in base64, you just read this base64 and convert it to byte [] by decoding it. >

First of all, add the apache-commons-codec to your project and then, upon receiving your JSON template, you decorate the base64:

byte[] decodedBytes = Base64.decodeBase64(base64String);

If you are using Java8 on the server, use the native java conversion:

byte[] decodedString = Base64.getDecoder().decode(encodedString.getBytes(StandardCharsets.UTF_8));
    
11.01.2018 / 17:40
0

As a base64 you need to pay attention to small details, on the web you set page breaks among other things, depending on the use, android does not have to do this, so you can indicate in the field 'flags' the type of the encoding , remembering that for each type of encoding you must use the same type to decode: source here

String text = "somenews";
byte[] dataParaEncode = text.getBytes(StandardCharsets.UTF_8);
//Usar UTF-8 se vc estiver usando o charset da sua requisição como UTF-8
String base64 = Base64.encodeToString(dataParaEncode, Base64.NO_WRAP);
//User NO_WRAP para não haver quebra de paginas, mais indicado para uso quando tratar imagens em base64

Decoding

byte[] data = Base64.decode(base64, Base64.NO_WRAP);
String textDecoded = new String(data, StandardCharsets.UTF_8);

In your case the variable data will be your " Blob "

    
15.01.2018 / 22:40
-1
Blob blob = new SerialBlob(foto.getBytes());
denuncia.foto = blob;

An option!

    byte[] byteData = foto.getBytes("UTF-8");
    Blob blobData = conexao.createBlob();
    blobData.setBytes(1, byteData);
    
11.01.2018 / 17:03