0

I have an android application which sends an image to my database as;

public class NewProductActivity extends Activity {

// Progress Dialog
private ProgressDialog pDialog;
public String image_str;
JSONParser jsonParser = new JSONParser();
EditText inputName;
EditText inputPrice;
EditText inputDesc;
EditText inputImg;
Button btnTakePhoto;
ImageView imgTakenPhoto;
private static final int CAM_REQUREST = 1313;
// url to create new product
private static String url_create_product = "http://buiud.com/android_connect/create_product.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_product);

    // Edit Text
    inputName = (EditText) findViewById(R.id.inputName);
    inputPrice = (EditText) findViewById(R.id.inputPrice);
    inputDesc = (EditText) findViewById(R.id.inputDesc);
    //inputImg = (EditText) findViewById(R.id.imageView1);

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher);          
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
    byte[] byte_arr = stream.toByteArray();
    image_str = Base64.encodeToString(byte_arr, Base64.DEFAULT);


    // Create button
    Button btnCreateProduct = (Button) findViewById(R.id.btnCreateProduct);

    // button click event
    btnCreateProduct.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            // creating new product in background thread
            new CreateNewProduct().execute();
        }
    });
    btnTakePhoto = (Button) findViewById(R.id.button1);
    imgTakenPhoto = (ImageView) findViewById(R.id.imageView1);

    btnTakePhoto.setOnClickListener(new btnTakePhotoClicker());

}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);

      if (requestCode == CAM_REQUREST) {
          Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
          imgTakenPhoto.setImageBitmap(thumbnail);
      }
}

class btnTakePhotoClicker implements Button.OnClickListener
{
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub

        Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAM_REQUREST);
    }
}
/**
 * Background Async Task to Create new product
 * */
class CreateNewProduct extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(NewProductActivity.this);
        pDialog.setMessage("Creating Product..");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Creating product
     * */
    protected String doInBackground(String... args) {
        String name = inputName.getText().toString();
        String price = inputPrice.getText().toString();
        String description = inputDesc.getText().toString();
        //String image_str = inputImg.getText().toString();

        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("name", name));
        params.add(new BasicNameValuePair("price", price));
        params.add(new BasicNameValuePair("description", description));
        params.add(new BasicNameValuePair("img",image_str));
        //params.add(new BasicNameValuePair("image", image));

        // getting JSON Object
        // Note that create product url accepts POST method
        JSONObject json = jsonParser.makeHttpRequest(url_create_product,
                "POST", params);

        // check log cat fro response
        Log.d("Create Response", json.toString());

        // check for success tag
        try {
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // successfully created product
                Intent i = new Intent(getApplicationContext(), AllProductsActivity.class);
                startActivity(i);

                // closing this screen
                finish();
            } else {
                // failed to create product
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once done
        pDialog.dismiss();
    }

}
}

Even thought I want the image to be .png it appears on the database as .bin, how can I change that, I have read about typing something when the application was calling the create.php but no cigar. I can't even display the .bin as an image on the HTML page.

SoftwareEnthusiast
  • 271
  • 2
  • 9
  • 26

2 Answers2

0

As your picture is encoded in Base64, you need to decode it on server side and save it as a PNG file.

<?php 
$decoded=base64_decode($encodedString);    
file_put_contents('newImage.PNG',$decoded);
?>

See http://php.net/fr/base64_decode

bashizip
  • 562
  • 5
  • 14
  • Is the $encodedString my MySQL variable which would be $img? Also is this used when I'm updating my db or retrieving from it? Many thanks! – SoftwareEnthusiast Jan 23 '14 at 08:32
  • It seems that you're storing the string endoded image in Mysql, right? Then it's normal that Mysql store it like binary file, your job is to decode that binary file before displaying it as PNG image. – bashizip Jan 23 '14 at 08:46
0
  <?php 
    $name = $_POST['image'];
     $entry = base64_decode($name);
     $image = imagecreatefromstring($entry);
     $directory = dirname(__FILE__).DIRECTORY_SEPARATOR."images/".DIRECTORY_SEPARATOR."index".$title.".jpeg";
     header ( 'Content-type:image/jpeg' );
     $imagetojpg=imagejpeg($image, $directory); 
     imagedestroy($image );      
     readfile ($directory);  
     exit ();
    ?>

This should work fine.image is a variable which contain base64 encoded string.

Sajith Vijesekara
  • 1,324
  • 2
  • 17
  • 52