Android post Base64 String to PHP

20,319

Solution 1

This is the code for image:

ByteArrayOutputStream bao = new ByteArrayOutputStream();                

bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bao);
byte [] ba = bao.toByteArray();
String ba1=Base64.encodeBytes(ba);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("image",ba1));

This is the HTTP code for sending the image to the server:

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://servername.com/uploadimage.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));        
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();

If you find any more difficulties ask me or a check:

In PHP header file changes :

header('Content-Type: image/jpg; charset=utf-8');
$base=$_REQUEST['image'];

Solution 2

Is the HTTP-Response-Code you are getting 200? If so, try setting these header-fields:

"Accept": "text/html"

"Accept-Language": "en"

"Content-Length": yourString.length

"Content-Type": "application/x-www-form-urlencoded"

Solution 3

Try sending your data as below:

HttpParams httpParams = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 60000);  //1 min
HttpConnectionParams.setSoTimeout(httpParams, 60000);          //1 min

HttpClient client = new DefaultHttpClient(httpParams);
HttpPost post = new HttpPost("http://myURL/uploadImage.php");

List<NameValuePair> pairs = new ArrayList<NameValuePair>();
pairs.add(new BasicNameValuePair("image", image_str));

post.setEntity(new UrlEncodedFormEntity(pairs, HTTP.UTF_8));   // as UTF-8
HttpResponse response = client.execute(post);

Solution 4

just download the Base64.java http://iharder.sourceforge.net/current/java/base64/ & put that file in your project & then

    just replace the 

String image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT); 

this with

String image_str = Base64.encodeBytes(byte_arr);

replace this post.setEntity(new UrlEncodedFormEntity(pairs)); with

  post.setEntity(new UrlEncodedFormEntity(pairs,HTTP.UTF_8));

Also check while importing the Base64 it will import file from your package & then post to server it will post.

in your php code just change

change this
$base = $_POST["image"]; to
$base = $_REQUEST['image'];

Solution 5

Have you tried reading the raw post data in PHP? Something like

$data = $xml = file_get_contents('php://input');

Have a look at this link for more info

http://www.codediesel.com/php/reading-raw-post-data-in-php/

Share:
20,319

Related videos on Youtube

PinkFloydRocks
Author by

PinkFloydRocks

iPhone novice - getting there one line at a time :-)

Updated on September 11, 2020

Comments

  • PinkFloydRocks
    PinkFloydRocks over 3 years

    ------ Solution ------
    The issue was on our server. It can only handle post requests if we put www in front of our domain name. So that's what caused the problems. I'm setting the first answer as THE answer since it worked once I sorted the URL out.


    Original Question

    I have a POST variable in my PHP script is always blank.
    I've tried to change the variable's name, the content of the variable etc..

    The problem has to reside in the java code, because when I var_dump() the request in php, it is null.

    This is my scenario:

    I let the user snap a photo, the photo is saved to the SD-card and I get the image's path, and eventually convert it to a Base64 string. I then want to post this base64 string to a php script that converts it back from Base64 and writes it as an image on my server's hard drive like so:

    File f = new File(savedImagePath);
    
    Bitmap bitmap = BitmapFactory.decodeFile(f.getPath());          
    ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
    bitmap.compress(Bitmap.CompressFormat.JPEG, 30, stream); 
    byte [] byte_arr = stream.toByteArray();
    String image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT);
    
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("http://myURL/uploadImage.php");
    List<NameValuePair> pairs = new ArrayList<NameValuePair>();
    
    pairs.add(new BasicNameValuePair("image", image_str));
    post.setEntity(new UrlEncodedFormEntity(pairs));
    HttpResponse response = client.execute(post);
    

    On the server end, this is what my PHP script looks like:

    <?php
    $base = $_POST["image"];
    $binary=base64_decode($base);
    header('Content-Type: bitmap; charset=utf-8');
    $file = fopen('uploaded_image.jpg', 'w');
    fwrite($file, $binary);
    fclose($file);
    
    echo "script done executing";
    ?>
    

    This is an example of a Base64 string I'm trying to post:

    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

    • Andreas Wong
      Andreas Wong about 12 years
      are you using android emulator? See if there's any network analyzer to make sure that "image" is indeed get sent out
    • PinkFloydRocks
      PinkFloydRocks about 12 years
      No, I'm testing on a HTC Wildfire at the moment. I'm using eclipse, is there a built in network analyzer or do I have to do some searching on the web?
    • Rizvan
      Rizvan about 12 years
      @PinkFloydRocks Problem occur a lot in this case .. if you have any more query ask here
    • Rizvan
      Rizvan about 12 years
      @PinkFloydRocks i got your mistake listen just add header('Content-Type: image/jpg; charset=utf-8'); sure you will get
    • PinkFloydRocks
      PinkFloydRocks about 12 years
      @TinTin I've tried editing the header as you proposed but still no luck.. Think I'm just going to close my eyes and hope that the magical debug fairy pays me a visit and fixes everything... Ah, that's better! ;)
    • Rizvan
      Rizvan about 12 years
      @PinkFloydRocks can u tell me what is reply from server
    • PinkFloydRocks
      PinkFloydRocks about 12 years
      @TinTin the reply from the server is just what is being echoed: "script done executing"
    • Rizvan
      Rizvan about 12 years
      @PinkFloydRocks look instead of echo string .. echo image ok ........... echo "<img src='upload_image.jpg'>"; check it tell what reply u got .. i can help u further
    • PinkFloydRocks
      PinkFloydRocks about 12 years
      Now it just echoed <img src='upload_image.jpg'>
    • Rizvan
      Rizvan about 12 years
      @PinkFloydRocks dude use this one echo "<img src=uploadimage.jpg>";
    • PinkFloydRocks
      PinkFloydRocks about 12 years
      @TinTin same result as the last echo I'm afraid
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Still no luck. It's probably worth mentioning that when I changed the $base variable in the php to get its data via $_REQUEST['image'] and I looked up the URL in my web browser, the data in the ?image= variable did get written to the file.
  • quickshiftin
    quickshiftin about 12 years
    Have you looked at the request with something like tcpmon? An easier way to start would be to just var_dump($_REQUEST); to see what you're working with in PHP. Another sanity check option would be to check $_SERVER['REQUEST_METHOD'] but it probly is POST... You can actually send GET data along w/ a POST request as well, not sure how the GET params are being set from your code sample, but in general I would recommend determining whether certain variables are coming from GET or POST and coding against that. $_REQUEST is more or less for debugging.
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Hi, I've tried your solution before, but it didn't work for me. It's really frustrating.. Thanks for your answer though.
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Sorry, no luck with this solution.. It definitely looks like the POST data isn't reaching my php script by some terribly odd reason..
  • Rizvan
    Rizvan about 12 years
    @PinkFloydRocks Have u tried php code changes what i written ?
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Just ran the $_SERVER['REQUEST_METHOD'] and it says GET!! Is this the source of all my problems?
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Changed to $_REQUEST[] but no luck now either
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Yeah, unfortunately no solution.. Sorry
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    I tried implementing a GET request (HttpGet instead of HttpPost) to the server in stead and the data is actually being sent, but I get an error (414 URI too large) and that's of course because of the length of the Base64 string. Know of a way to post large strings via GET?
  • waqaslam
    waqaslam about 12 years
    one thing, is this http://myURL/uploadImage.php you purposely made? confirm if you aren't using it mistakenly :)
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    yeah - wish it was that simple :-) I'll give your approach a try - thanks!
  • PinkFloydRocks
    PinkFloydRocks about 12 years
    Wow... I just spoke to one of our server guys, and the problem was actually related to what your comment was about.. I had to use www in front of our domain name with post requests... Wow... I'm going to upvote your answer but I can't give you the answer since all the examples are now working. But THANKS!
  • quickshiftin
    quickshiftin about 12 years
    I would try to avoid sending large amounts of data over GET and figure out how to send over POST from the android. Glad to hear we uncovered something of the issue though!