সার্ভারে যে কোন টেক্সট আপলোড করা সহজ হলেও ইমেজ আপলোড করে একটু কমপ্লেক্স। ইমেজ আপলোড করতে হলে ইমেজ ফাইলকে আগে Base64 এ এনকোড করে নিতে হয়। তারপর ঐটা স্টিং হিসেবে সার্ভারে পাঠাতে হয়। এবং সার্ভারে আবার Base64 কে ডিকোড করে ইমেজ ফাইল হিসেবে সেভ করতে হয়। ধাপ গুলো হচ্ছে এটাঃ
- ইমেজ সিলেক্ট করা
- সিলেক্ট করা ইমেজকে Base64 এ কনভার্ট করা, যেটি একটি স্ট্রিং ভ্যালু।
- সার্ভারে ঐ স্টিং ভ্যালুটা পোস্ট করা। যা সাধারণ Volley সিম্পল পোস্ট এর মত।
সার্ভার সাইডে এরপর Base64 স্টিং থেকে আবার ইমেজে কনভার্ট করা। সার্ভার সাইডের কোডঃ
<?php if($_SERVER['REQUEST_METHOD']=='POST'){ $image = $_POST['image']; $random_name = substr( md5(rand()), 0, 7); $path = "uploads/$random_name.png"; file_put_contents($path,base64_decode($image)); echo "Successfully Uploaded"; } ?>
এটা হচ্ছে মিনিমাল কোড। কাজ করবে। এটা প্রোডাকশনে ব্যবহার করা যাবে না। শুধু আইডিয়া নেওয়ার জন্য যথেষ্ট। এখানে সার্ভারে যখন আমরা পোস্ট করব, তখন $image = $_POST[‘image’]; দিয়ে ভ্যালুটা নিব। এরপর একটা পাথে ইমেজটা সেভ করব। ইমেজের নাম রেন্ডমলি একটা নাম জেনারেট করে দিয়েছি। file_put_contents ফাংশন ব্যবহার করে আমরা ঐ পাথে Base64 স্টিং থেকে কনভার্ট করে ইমেজটা রেখেছি।
এখন যদি ইমেজের url টা ডেটাবেজে সেভ করা দরকার হয়, তাহলে ডেটাবেজে এই পাথটা সেভ করলেই হবে। ডেটাবেজ নিয়ে কাজ করার জন্য অ্যান্ড্রয়েড থেকে ডাটাবেজে ডাটা সেভ করার জন্য Android + PHP + MySQL টিউটোরিয়াল এই টিউটোরিয়ালটাতে বিস্তারিত আলোচনা করা হয়েছে।
এবার আসি xml এ। ইমেজ সিলেক্ট করার জন্য একটা বাটন লাগবে, কোন ইমেজ সিলেক্ট করেছি, তা দেখার জন্য একটা ইমেজ ভিউ লাগবে, এবং আপলোড করার জন্য একটা বাটন লাগবে। সম্পূর্ণ activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Choose Image" android:id="@+id/buttonChoose" /> <ImageView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" android:id="@+id/imageView" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Upload Image" android:id="@+id/buttonUpload" /> </LinearLayout>
এরপর? জাভা পার্ট। ইমেজ সিলেক্ট করা, এবং সিলেক্ট শেষে তা ভিউতে দেখানোর জন্য কোডঃ
private void showFileChooser() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { Uri filePath = data.getData(); try { //Getting the Bitmap from Gallery bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); //Setting the Bitmap to ImageView imageView.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } }
ইমেজকে কনভার্ট করার জন্য ফাংশনঃ
public String getStringImage(Bitmap bmp) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageBytes = baos.toByteArray(); String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); return encodedImage; }
আপলোড ফাংশনটাঃ
private void uploadImage() { //Showing the progress dialog 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(MainActivity.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(MainActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show(); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { //Converting Bitmap to String String image = getStringImage(bitmap); //Creating parameters Map<String, String> params = new Hashtable<String, String>(); //Adding parameters params.put(KEY_IMAGE, image); //returning parameters return params; } }; //Creating a Request Queue RequestQueue requestQueue = Volley.newRequestQueue(this); //Adding request to the queue requestQueue.add(stringRequest); }
যখন আপলোড বাটনে ক্লিক করবে, তখন আপলোডিং প্রোগ্রেস বার দেখাবে। এরপর Volley স্ট্রিং রিকোয়েস্ট কল করবে। প্যারামিটার হিসেবে আমাদের Base64 এ কনভার্ট করা স্ট্রিং ইমেজটি। এতটুকুই! সম্পূর্ণ MainActivity.java:
import android.app.ProgressDialog; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.support.v7.app.AppCompatActivity; import android.util.Base64; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Hashtable; import java.util.Map; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button buttonChoose; private Button buttonUpload; private ImageView imageView; private Bitmap bitmap; private int PICK_IMAGE_REQUEST = 1; private String UPLOAD_URL = "http://example.xyz/upload.php"; private String KEY_IMAGE = "image"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); buttonChoose = (Button) findViewById(R.id.buttonChoose); buttonUpload = (Button) findViewById(R.id.buttonUpload); imageView = (ImageView) findViewById(R.id.imageView); buttonChoose.setOnClickListener(this); buttonUpload.setOnClickListener(this); } public String getStringImage(Bitmap bmp) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte[] imageBytes = baos.toByteArray(); String encodedImage = Base64.encodeToString(imageBytes, Base64.DEFAULT); return encodedImage; } private void uploadImage() { //Showing the progress dialog 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(MainActivity.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(MainActivity.this, volleyError.getMessage().toString(), Toast.LENGTH_LONG).show(); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { //Converting Bitmap to String String image = getStringImage(bitmap); //Creating parameters Map<String, String> params = new Hashtable<String, String>(); //Adding parameters params.put(KEY_IMAGE, image); //returning parameters return params; } }; //Creating a Request Queue RequestQueue requestQueue = Volley.newRequestQueue(this); //Adding request to the queue requestQueue.add(stringRequest); } private void showFileChooser() { Intent intent = new Intent(); intent.setType("image/*"); intent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { Uri filePath = data.getData(); try { //Getting the Bitmap from Gallery bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath); //Setting the Bitmap to ImageView imageView.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onClick(View v) { if (v == buttonChoose) { showFileChooser(); } if (v == buttonUpload) { uploadImage(); } } }
Brother how can we upoload multiple photo using volley library.