Let me explain my problem.
I am trying to set Facebook profile image in app Imageview some thing like this ..
// Getting Facebook URL image and converting same to bitmap
Bitmap mIcon1;
URL img_value = new URL("http://graph.facebook.com/"+ userProfileID +"/picture?type=square");
BitmapFactory.Options options = new BitmapFactory.Options();
mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream(), null, options);
Then after ..
// I am setting bitmap to imageview .. some thing like ..
if(mIcon1!=null) {
user_picture.setImageBitmap(mIcon1);
}
Up to here it is working great ...
Now I need to save that Facebook Profile image into my DB located at server ...
I am performing that stuff some thing like ..
// Created a method for encoding ..
public static String encodeTobase64(Bitmap image)
{
Bitmap immagex=image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
Log.e("LOOK", imageEncoded);
return imageEncoded;
}
// Now trying to use this method to get encoded BASE 64 image in string ..
String final_image = encodeTobase64(mIcon1);
Now when I try to send this string to my server then at server end I am recieving broken link ... Instead I must say that it's not working ..
I need to perform two of stuff
Encode Facebook profile image to Encoded BASE 64 string so as to send same to server.
Get type of image (i.e. PNG/ JPG ... ) or compress and send that image in one specific format.
Looking forward for any suggestion on this.
Thanks!
I got solution of this and hope this will help some one ..
# Base concept :-- We generally use GET or POST method while sending data to server.
1- GET:-- In this method you can only send specific amount of data ..
2- POST :-- In this method you can send huge amount of data ..
Problem was :-- Exact problem was that .. I was using GET method while sending data to server. Above mentioned concept was know to me . but, some how I did that mistake.
Solution :-- You simply need to send data to server using POST method instead of GET.
Complete solution for this in undermentioned :--
// Define your ASYNC TASK like ..
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
new ImageTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else{
new ImageTask().execute();
}
AND
// Now here comes your complete Async Task over here ..
private class ImageTask extends AsyncTask<Void, Integer, Void> {
Bitmap mIcon1;
#Override
protected Void doInBackground(Void... params) {
URL img_value = null;
Log.d("taking", "2");
try {
if(type_of_login.equalsIgnoreCase("facebook")){
img_value = new URL("http://graph.facebook.com/"+ user_id +"/picture?type=square");
System.out.println("Complete URl is:============================= " + img_value);
}else{
img_value = new URL("https://plus.google.com/s2/photos/profile/"+ user_id +"?sz=50");
System.out.println("Complete URl is:============================= " + img_value);
}
//img_value = new URL("http://graph.facebook.com/"+ userProfileID +"/picture?type=square");
BitmapFactory.Options options = new BitmapFactory.Options();
mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream(), null, options);
Log.d("taking", "3" + img_value);
Log.d("taking", "3" + mIcon1);
Log.d("taking", String.valueOf(mIcon1));
ByteArrayOutputStream bao = new ByteArrayOutputStream();
mIcon1.compress(Bitmap.CompressFormat.JPEG, 100, bao);
byte [] ba = bao.toByteArray();
encoded_image =Base64.encodeToString(ba,Base64.DEFAULT);
System.out.println("Encoded image is : ===== " + encoded_image);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
return null;
}
#Override
protected void onPostExecute(Void result) {
if(mIcon1!=null)
{
user_pic.setImageBitmap(mIcon1);
get_string_image = encodeTobase64(mIcon1);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
}
}
}
Now finally our dream method ..
public static String encodeTobase64(Bitmap image)
{
Bitmap immagex=image;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
immagex.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
Log.e("LOOK", imageEncoded);
return imageEncoded;
}
Now when you need to send data over API then simply execute HttpPost instead of HttpGet
That's it .. you are good to go with this ..
Related
I want to upload image to server without compress it because I am compressing the image in another function and than sending the image to uploadtoserver function.
here is my code to upload the image to server but i dont understand how to upload the image to server without compress it.
public String uploadtoserver(String imgPathm){
//int flag=0;
try{
Bitmap bm = BitmapFactory.decodeFile(imgPathm);
ByteArrayOutputStream bao = new ByteArrayOutputStream();
byte[] ba = bao.toByteArray();
String ba1 = Base64.encodeToString(ba, 0);
//ba1 = Base64.encodeBytes(ba);
return ba1;
}
catch (Exception e)
{
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
return null;
}
}
I just want to know will my above code work to upload image to server. thank you
I am trying to upload multiple images to my node server via Android Studio. However the image file always seems to be corrupt on the server. I am able to take and preview the picture in Android but not able to store it on my server.
Here is my server code
app.post('/upload', function(req, res) {
var base64Data = req.rawBody;
fs.writeFile("test.jpg",base64Data,'base64',function(err,written){
if(err) console.log(err);
else {
console.log("file Succesfully written ");
cloudinary.uploader.upload("test.jpg", function (image) {
if(image !== undefined) {
res.json({link: image.secure_url}).end();
console.log("url = " , image.secure_url);
// fs.unlink(ImageFile);
} else console.log.error("Error uploading to Cloudinary, ", image);
});
}
});
});
Here is my front end code I use to convert my bitmap to an encoded Base64 String.
final String encodedString = ImageBase64.encode(fileArray.get(i));
Here is a log of what encodedString holds after being set. Obviously the full value is not displayed.
/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB
AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAMgA+gDASIA
AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
However on my backend it is displayed as this
2F9j%2F4AAQSkZJRgABAQAAAQABAAD%2F2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB%0AAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH%2F2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB%0AAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH%2FwAARCAMgA%2BgDASIA%0AAhEBAxEB%2F8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQ
If you get it url encoded then you should url decode it.
InputStream imageStream;
try {
imageStream = getContentResolver().openInputStream(uri);//uri is the image URI
Bitmap bm = BitmapFactory.decodeStream(imageStream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, baos); //bm is the bitmap object
byte[] byteArray = baos.toByteArray();
String encodedImage = Base64.encodeToString(byteArray,Base64.NO_WRAP);//encodedImage is your image string
} catch (FileNotFoundException e) {
e.printStackTrace();
}
I got bad request 400 when i send base64 image in the web service,
I put base64 string to JSON and POST it using retrofit. here is my code
Bitmap bm = BitmapFactory.decodeFile("IMAGE PATH");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 50, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream .toByteArray();
String imgbase64 = Base64.encodeToString(byteArray, Base64.NO_WRAP + Base64.URL_SAFE);
And add to JSONObject
JSONObject jo = new JSONObject();
try {
jo.put("id",users.get(counter).getId());
jo.put("firstname",users.get(counter).getFirstname());
jo.put("middlename",users.get(counter).getMiddlename());
jo.put("lastname",users.get(counter).getLastname());
jo.put("suffix",users.get(counter).getSuffix());
jo.put("image",imgbase64);
jo.put("date_registered",users.get(counter).getDate_registered());
} catch (JSONException e) {
e.printStackTrace();
}
And I will send it using retrofit
ServiceInterface si = RestClient.getClient();
Observable<Response> call = si.postUser(jo.toString());
Image size is 200kb and i got an error bad request
but when my image size is only 10kb it works fine.
please help.
Try to use Below solution for decode the image and send
Bitmap bitmap;
String encodedString ="";
String filepath=""; // your uploaded image file path
try {
BitmapFactory.Options options = null;
options = new BitmapFactory.Options();
options.inSampleSize = 1;
bitmap = BitmapFactory.decodeFile(filepath, options);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
// Must compress the Image to reduce image size to make upload easy
bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byte_arr = stream.toByteArray();
// Encode Image to String
encodedString = Base64.encodeToString(byte_arr, 0);
} catch (Exception e) {
e.printStackTrace();
}
You can put encodedString to the your JSON.
Here is the PHP webservice for decode and upload image to server, also perform your operation to database.
<?php
include('../db/config.php');
// Get image string posted from Android App
$base=$_REQUEST['image'];
// Get file name posted from Android App
$filename = $_REQUEST['filename'];// this your image filename like testimage.jpg
//other files
$id= $_REQUEST['id'];
$firstname = $_REQUEST['firstname'];
$middlename = $_REQUEST['middlename'];// add your parameter
// Decode Image
$binary=base64_decode($base);
header('Content-Type: bitmap; charset=utf-8');
// Images will be saved under 'www/imgupload/uplodedimages' folder
$file = fopen('uploads/'.$filename, 'wb');
// Create File
fwrite($file, $binary);
fclose($file);
// echo 'Image upload complete, Please check your php file directory';
if(isset($filename) && $filename !=''){
$fileUrl = "http://yourdomain/android/upload/".$filename;
}else{
$fileUrl = '';
}
$sql=mysql_query("INSERT INTO tbl_name(Id,firstName,middleName,FileUrl) VALUES ('$Id','$firstName','$middleName','$fileUrl')");
?>
I suggest to try to use this solution, It will work.
I want to send a image to server in a JSON webservice (by using a string parameter in JSON post method) and i want to get image from URI path.
The folowing class is what i use to download a picture (in my case it was a jpeg) from a given url. It is a piece from my own code so there may be some project specific stuff in there. Just read past that:).
public class BitmapFromUrl
{
private Bitmap myBitmap;
public BitmapFromUrl(String imageUrl)
{
URL myImageURL = null;
try
{
myImageURL = new URL(imageUrl);
}
catch (MalformedURLException error)
{
Log.e("tag", "The URL could not be formed from the provided String" + error);
}
if((myImageURL != null) && (imageUrl != null)) {
try
{
HttpURLConnection connection = (HttpURLConnection)myImageURL .openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
myBitmap = BitmapFactory.decodeStream(input);
}
catch (IOException e)
{
Log.e("tag", "The Bitmap could not be downloaded or decoded!" + e);
}
} else {
Log.e("tag", "The provided URL(\"" + imageUrl + "\") does not seem to be valid.");
myBitmap = null;
}
}
public Bitmap getBitmap()
{
return myBitmap;
}
}
To send get a String of this image you can use the following:
Bitmap bm = BitmapFactory.decodeFile("/thePathToYour/image.jpeg");
ByteArrayOutputStream output = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, output); //bm is the bitmap object
byte[] bytes = output.toByteArray();
String base64Image = Base64.encode(bytes, Base64.DEFAULT);
Now you have the image as a string. On the server you can change it back to an image using the Base64 methods of your servers programming language.
json.put(WebConstant.JSON_PUT_PROPERTY_BUZZ_IMAGE, base64Image);
This should do the job.
in your line:
json.put(WebConstant.JSON_PUT_PROPERTY_BUZZ_IMAGE, " SEND IMAGE as URI ");//buzzInfoBean.getBuzzImage());
"SEND IMAGE as URI " should be a base64 encoded string most likely, I don't know what the server is expecting, but that is most common.
Check out the answer to this question
Getting the image from the local uri
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri1)
I am trying to download images from a remote server, the number of images downloaded is 30. The code i am using to download image is as below. Some images download successfully and some images don't download and raises the above exception. What might be the problem.
public static Bitmap loadBitmap(String url)
{
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new URL(url).openStream(), 4*1024);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, 4 * 1024);
int byte_;
while ((byte_ = in.read()) != -1)
out.write(byte_);
out.flush();
final byte[] data = dataStream.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
//options.inSampleSize = 1;
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,options);
} catch (IOException e) {
Log.e("","Could not load Bitmap from: " + url);
} finally {
try{
in.close();
out.close();
}catch( IOException e )
{
System.out.println(e);
}
}
return bitmap;
}
Please look on my this post
Image download code works for all image format, issues with PNG format rendering
In my case I solved this error with encode the url
Because image url that i wanted to download has the Persian letters(or other Unicode character) in it
So I replaced all Persian characters with encoded UTF-8 letters