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 a
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:
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
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?
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.