2

I have a requirement where, i am sending a json file to the server and the parsing happens at the server side. I have created the entries to the json file, now i want to store an image stored in imageview as an entry to the json file. Searched several previous posts but could not find exactly what to do. Any pointers would be of great help for storing the image in json format for sending through server.

bharath
  • 953
  • 4
  • 17
  • 30

4 Answers4

10

If you want to include Image in a JSON object which you will be sending in a request, convert Image into Base64 string and put this string into the JSON object.

For example:

String encodedImage = Base64.encodeToString(byteArrayImage, Base64.DEFAULT);

Check:

Community
  • 1
  • 1
Paresh Mayani
  • 127,700
  • 71
  • 241
  • 295
2

Try base64-encoding the image (like below, where the Uri is your Image - but beware: ImageView has no Getter for the ImageUri, so you have to store it by yourself!):

Uri uri = (Uri) extras.getParcelable(Intent.EXTRA_STREAM);

ContentResolver cr = getContentResolver();
InputStream is = cr.openInputStream(uri);

byte[] data = getBytesFromFile(is);

byte[] encoded_data = Base64.encodeBase64(data);
data_string = new String(encoded_data);

Now you have an base64-encoded String data_string that you can send with your JSON request. On the server-side you just have to decode the String and save the picture.

webmonkey
  • 1,083
  • 1
  • 15
  • 33
1

Well, it's kind of experimental, but you can create an array of bytes out of the bitmap, and then create a new string with that array of bytes, and then send it to the server.

However, why don't you just send a POST request to save the image directly, without any experimental processing or parsing?

Charlie-Blake
  • 10,832
  • 13
  • 55
  • 90
0

you have an ImageView

<ImageView
      android:layout_width = "300dp"
      android:layout_height = "300dp"
      android:id = "@+id/Plaatjeid"
      android:scaleType = "centerCrop"
    android:text = "@string/BerttxtPlaatje"
    android:layout_alignParentEnd="true"
/>

and in the codebehind

String plaatje="";
ImageView iv1 = (ImageView)findViewById(R.id.Plaatjeid);
    iv1.buildDrawingCache();
    Bitmap bitmap = iv1.getDrawingCache();
    ByteArrayOutputStream stream=new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
    byte[] image=stream.toByteArray();
    plaatje = Base64.encodeToString(image, 0);

then you create your Json string

String mailMessage;
mailMessage="<?xml version='1.0'?>";
mailMessage=mailMessage + "<RiscNotification xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'";
mailMessage=mailMessage + "xmlns:xsd='htp://www.w3.org/2001/XMLSchema'>";
mailMessage = mailMessage + "        <mail To>"  + Mailto() + "</mail To>" ;//server7
mailMessage = mailMessage + "</RiskNotification>";

I have a seperate Class in which I send it Attach the variables to the Class

GetMethodDemo JsonConnect = new GetMethodDemo();
JsonConnect.MailTo=  Mailto();
JsonConnect.Picture=plaatje;
JsonConnect.bertactivity=this;
JsonConnect.execute();//staat in AANHET BEGIN

and my Class

    package nl.yentel.finekinney;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;

    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.os.AsyncTask;
    import android.view.Gravity;
    import android.widget.Toast;

    public class GetMethodDemo extends AsyncTask<String, Void, String> {
    String MailTo;
    String Picture;
    Activity bertactivity;
    Bitmap bm;

     public void BitMapFoto(Bitmap bitmap) {
        bm = bitmap;
    }

    //@Override
    protected String doInBackground(String... strings) {

          //http://geekonjava.blogspot.com/2014/03/upload-image-on-server-in-android-using.html

        String dBresultaat = "start";
        try {
            URL url = new URL("http://10.0.2.2:64489/Risico/Risico.asmx/sendMail");

            HttpURLConnection con = (HttpURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setRequestProperty("Content-Type", "application/json");
            con.setRequestProperty("Accept", "application/json");
            con.setDoOutput(true);
            String jsonInputString = "";
            jsonInputString = "{";
             jsonInputString = jsonInputString + "\"MailTo\": \"" + MailTo.toString() + "\",";
            jsonInputString = jsonInputString + "\"Picture\": \"" + Picture.toString() + "\""; 
             //if you take the Picture.toString in debug mode and put it in https://base64.guru/converter/decode/image you see the picture
              jsonInputString = jsonInputString + "}";

            try (OutputStream os = con.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
                int code = con.getResponseCode();
                System.out.println(code);

                try (BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8"))) {
                    StringBuilder response = new StringBuilder();
                    String responseLine = null;
                    while ((responseLine = br.readLine()) != null) {
                        response.append(responseLine.trim());
                    }
                    System.out.println(response.toString());
                    return response.toString();
                }

            } catch (Exception e) {
                e.printStackTrace();
                return "catch twee";
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "catch";
        }
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected void onPostExecute(String s) {
        // super.onPostExecute(s);
        Activity activity = new Bert().activity;
        Toast toast = Toast.makeText(bertactivity, s, Toast.LENGTH_LONG);
        toast.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);
        toast.show();
    }
    }

You should have your webservice in Framework 4.0. Framework 3.5 does not work

and the web.config shows

<configuration>
  
  <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="50000000"/>
      </webServices>
    </scripting>
  </system.web.extensions>  
 <system.web>

My webmethod looks like this

[WebMethod()]
public string sendMail(sstring MailTo, string Picture)
{      
    string Resultstring = "";
    int i;
    MailMessage theMessage;
    theMessage = new MailMessage();
    // look if there is an attempt to hack the server
    if ((MailBody.ToUpper()).IndexOf("SELECT") > 0 | (MailBody.ToUpper()).IndexOf("UPDATE") > 0)
    {
        Resultstring = "illegal string";
    }
    else
    {
        theMessage.From = new System.Net.Mail.MailAddress(ConfigurationManager.AppSettings["sender"]); // '"no-reply@taakmonitor.nl")
        try
        {
            theMessage.To.Add(new MailAddress(MailFrom)); // also send a mail to the sender
        }
        catch (Exception ex)
        {
            Resultstring = "Mail address "+ MailFrom + " not ok "; //ex.Message; // als het formaat van het mail adres niet goed is
            theMessage = null;
        }
        String FransGetsCopy = WebConfigurationManager.AppSettings["FransGetsCopy"];

        String[] ToWhom = NullSafeString(MailTo).Split(',');
        for (i = 0; i <= ToWhom.Length - 1; i++)
        {
            try
                {
                   theMessage.To.Add(new MailAddress(ToWhom[i]));
                }
            catch (Exception ex)
                {
                    Resultstring = Resultstring + " mail address " + ToWhom[i] + " not ok "; //ex.Message; // als het formaat van het mail adres niet goed is
                    theMessage = null;
                 }                
        }

        // there should also be a stylesheet
          string StyleText="";
        try
        {
            StyleText = "";
            var data = File.ReadAllText(Server.MapPath("~/App_Data/TextFile.txt"));
            StyleText = data.ToString();   
        }
        catch (Exception)
        {
            Resultstring = Resultstring + " No StyleText available. ";
        }
        theMessage.Subject = MailSubject;
        theMessage.IsBodyHtml = true;
        //the message is created in HTML with the style in the <head> and the MailBody in the body
        theMessage.Body = "<html>" + StyleText + "<body>" + MailBody + "</body></html>";

        // code copied from
        // https://www.codeproject.com/Tips/569532/Submit-Images-to-Web-Service-and-Get-Them-Back
        //in this piece of code I convert the Json picture data to a picture and attach it to the mail
        try
        {
            byte[] data = Convert.FromBase64String(Picture);
            var stream = new MemoryStream(data, 0, data.Length);
            System.Drawing.Image img = System.Drawing.Image.FromStream(stream);
            stream.Seek(0L, SeekOrigin.Begin);
            theMessage.Attachments.Add(new Attachment(stream, "Picture.png"));
            Resultstring = Resultstring +  " image OK";
        }
        catch (Exception ex)
        {
            Resultstring = Resultstring +  " image not OK";
        } 
        SmtpClient MessageObject = new SmtpClient();
        MessageObject.Host = ConfigurationManager.AppSettings["Host"];
        MessageObject.Port = Int32.Parse(ConfigurationManager.AppSettings["Port"]);
        MessageObject.EnableSsl = false;
        MessageObject.Credentials = new System.Net.NetworkCredential(ConfigurationManager.AppSettings["Username"], ConfigurationManager.AppSettings["Password"]);
        try
        {
            MessageObject.Send(theMessage);
            Resultstring = Resultstring +  " mail has been send.";
        }
        catch (Exception ex)
        {
            Resultstring = Resultstring +  " mail has NOT been send.";
        }
        MessageObject = null;
        theMessage = null;
    }
    return Resultstring;
}

at last I have a stylesheet TestFile.txt in the App_data folder attached

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-=1">
    <meta content="text/html; charset=us-ascii">
    <style>
        h1{color:blue;}

        .EditText{
            background:#ff0000;/*rood*/
            height:100;
            font-size:10px;
            color:#0000ff;/*blauw*/
        }
        .EditTextVervolg{
            background:#00cc00;/*groen*/
            font-size:20px;
            color:#ffff00;/*geel*/
        }
    </style>
</head>

Have fun

frans eilering
  • 449
  • 4
  • 6