2

------ 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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

OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
PinkFloydRocks
  • 808
  • 3
  • 14
  • 29

5 Answers5

3

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'];
Emile Bergeron
  • 17,074
  • 5
  • 83
  • 129
Rizvan
  • 2,335
  • 2
  • 23
  • 42
1

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/

quickshiftin
  • 66,362
  • 10
  • 68
  • 89
  • 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. – PinkFloydRocks Mar 29 '12 at 07:51
  • Have you looked at the request with something like [tcpmon](http://java.net/projects/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. – quickshiftin Mar 29 '12 at 08:03
  • Just ran the $_SERVER['REQUEST_METHOD'] and it says GET!! Is this the source of all my problems? – PinkFloydRocks Mar 29 '12 at 08:15
  • 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? – PinkFloydRocks Mar 29 '12 at 09:19
  • 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! – quickshiftin Mar 29 '12 at 16:06
1

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'];

Sumant
  • 2,775
  • 2
  • 22
  • 30
1

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);
waqaslam
  • 67,549
  • 16
  • 165
  • 178
  • one thing, is this `http://myURL/uploadImage.php` you purposely made? confirm if you aren't using it mistakenly :) – waqaslam Mar 29 '12 at 09:50
  • yeah - wish it was that simple :-) I'll give your approach a try - thanks! – PinkFloydRocks Mar 29 '12 at 10:51
  • 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! – PinkFloydRocks Mar 29 '12 at 10:55
1

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"

CAA
  • 968
  • 10
  • 27