Image Upload android Java + Asp.net (C#)
Currently am using Volley
to upload an Image
to the server but the Image uploads with 0kb
, without a Name even , The way i upload the image from android, i first turn my bitmap into a String
then , the C#
code on the server side turns the String back to the Bitmap
, below is my java Code :
private String UPLOAD_URL ="http://xxxxx:8092/PoliceApp/ImageUpload.aspx";
private void onUploading() {
final ProgressDialog loading = ProgressDialog.show(this,"Uploading...","Please wait...",false,false);
StringRequest stringRequest = new StringRequest(Request.Method.POST, UPLOAD_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//Disimissing the progress dialog
loading.dismiss();
//Showing toast message of the response
Toast.makeText(CrimesReporting.this, s , Toast.LENGTH_LONG).show();
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
//Dismissing the progress dialog
loading.dismiss();
//Showing toast
Toast.makeText(CrimesReporting.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show();
}
}){
@Override
protected Map<String, String> getParams() throws AuthFailureError {
//Converting Bitmap to String
selectedFilePath = getStringImage(bitmap);
// Uri selectedImageUri = data.getData();
//String video = getVideo(selectedImageUri);
File fileAttachment;
//Getting Image Name
String contact = contact_crimes.getText().toString().trim();
String PersonalContact = information_crimes_edt.getText().toString().trim();
String CrimesList = spinner.getSelectedItem().toString();
//Creating parameters
Map<String,String> params = new Hashtable<String, String>();
//Adding parameters
params.put("CrimeContact", contact);
params.put("CrimeInformation", PersonalContact);
params.put("CrimeDate", CrimesList);
params.put("photo",selectedFilePath);
//returning parameters
return params;
}
};
//Creating a Request Queue
RequestQueue requestQueue = Volley.newRequestQueue(this);
//Adding request to the queue
requestQueue.add(stringRequest);
}
And this is the code on the server side to Upload the Image to the server (Using Asp.net and C#) . But i have failed to place the Image and it's name in this method
SaveImage(ImagePic,ImageName);
Below is the code :
public partial class PoliceApp_ImageUploadaspx : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string ImagePic= "";
string ImageName= "";
SaveImage(ImagePic,ImageName);
}
public bool SaveImage(string ImgStr, string ImgName)
{
String path = HttpContext.Current.Server.MapPath("~/ImageStorage"); //Path
//Check if directory exist
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path); //Create directory if it doesn't exist
}
string imageName = ImgName + ".jpg";
//set the image path
string imgPath = Path.Combine(path, imageName);
byte[] imageBytes = Convert.FromBase64String(ImgStr);
File.WriteAllBytes(imgPath, imageBytes);
return true;
}
}
Solution 1:
You are only sending the path to the image in your request. This path won't be accessible from your server. I would also not recommend using a StringRequest for sending an image. Instead I would use something like this:
public class ImagePostRequest<T> extends Request<T> {
private final byte[] body;
public ImagePostRequest(Bitmap bitmap) {
super(Request.Method.POST, UPLOAD_URL, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
}
});
this.body = getBytesFromBitmap(bitmap);
}
// convert from bitmap to byte array
public static byte[] getBytesFromBitmap(Bitmap bitmap) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 70, stream);
return stream.toByteArray();
}
@Override
public String getBodyContentType() {
return "jpg/jpeg";
}
@Override
public byte[] getBody() {
return this.body;
}
}