I copied this class from https://gist.github.com/ishitcno1/11394069 I will show you how you use it. This worked in my case. Copy this class. Make the necessary changes.
package com.tagero.watchfriend; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import org.apache.http.HttpEntity; import org.apache.http.entity.mime.MultipartEntityBuilder; import org.apache.http.entity.mime.content.FileBody; import android.util.Log; import com.android.volley.AuthFailureError; import com.android.volley.NetworkResponse; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyLog; public class PhotoMultipartRequest extends Request<String> { static final String TAG = "xxxxxx"; public static final String KEY_PICTURE = "kullanici_resmi"; public static final String KEY_PICTURE_NAME = "kullanici_resmi_dosya_adi"; private HttpEntity mHttpEntity; @SuppressWarnings("rawtypes") private Response.Listener mListener; public PhotoMultipartRequest(String url, String filePath, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); mListener = listener; mHttpEntity = buildMultipartEntity(filePath); } public PhotoMultipartRequest(String url, File file, Response.Listener<String> listener, Response.ErrorListener errorListener) { super(Method.POST, url, errorListener); mListener = listener; mHttpEntity = buildMultipartEntity(file); } private HttpEntity buildMultipartEntity(String filePath) { File file = new File(filePath); return buildMultipartEntity(file); } private HttpEntity buildMultipartEntity(File file) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); String fileName = file.getName(); logYazdir("fileName : " + fileName); FileBody fileBody = new FileBody(file); builder.addPart(KEY_PICTURE, fileBody); builder.addTextBody(KEY_PICTURE_NAME, fileName); return builder.build(); } @Override public String getBodyContentType() { return mHttpEntity.getContentType().getValue(); } @Override public byte[] getBody() throws AuthFailureError { ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { mHttpEntity.writeTo(bos); } catch (IOException e) { VolleyLog.e("IOException writing to ByteArrayOutputStream"); } return bos.toByteArray(); } @Override protected Response<String> parseNetworkResponse(NetworkResponse response) { return Response.success("Uploaded", getCacheEntry()); } @SuppressWarnings("unchecked") @Override protected void deliverResponse(String response) { mListener.onResponse(response); } private void logYazdir(String str) { if (Sabitler.LOG_KONTROL) { Log.d(TAG, str); } } }
And here is this image upload method.
public void resimYukle(final String filePath) { logYazdir("KaydolActivity-uploadImage çağırıldı!"); logYazdir("\nfilePath : " + filePath); RequestQueue rq = Volley.newRequestQueue(this); PhotoMultipartRequest stringRequest = new PhotoMultipartRequest( Sabitler.URL_RESIM_YUKLE, filePath, new Response.Listener<String>() { @Override public void onResponse(String response) { logYazdir("response : " + response); JSONObject veri_json; try { veri_json = new JSONObject(response); int success = 0; String message = ""; try { success = veri_json .getInt(Sabitler.SERVER_RESP_SUCCESS); message = veri_json .getString(Sabitler.SERVER_RESP_MESSAGE); Log.d(TAG, "success : " + success + "\nmessage : " + message); } catch (JSONException e) { e.printStackTrace(); } } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { logYazdir("Error [" + error + "]"); Toast.makeText(getBaseContext(), "Sunucuya bağlanılamadı!", Toast.LENGTH_LONG) .show(); } }) { @Override protected Map<String, String> getParams() { Map<String, String> params = new HashMap<String, String>(); params.put("kullanici_resmi_dosya_adi", ""); return params; } }; rq.add(stringRequest); }
How do you get filePath
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { logYazdir("KaydolActivity-onActivityResult çağırıldı!"); if (requestCode == GALERIDEN_RESIM && resultCode == RESULT_OK && data != null) { logYazdir("KaydolActivity-GALERIDEN_RESIM çağırıldı!"); Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); Bitmap bmp = null; try { bmp = getBitmapFromUri(selectedImage); } catch (IOException e) { e.printStackTrace(); } kullanici_resmi_iview.setImageBitmap(bmp); resimYukle(picturePath); } super.onActivityResult(requestCode, resultCode, data); }
Finally, define this in your activity,
private int GALERIDEN_RESIM = 2;
The important part is the PHP code for your server,
<?php $target_dir = "resimler/"; $target_file = $target_dir . basename($_FILES["kullanici_resmi"]["name"]); $uploadOk = 1; $imageFileType = pathinfo($target_file,PATHINFO_EXTENSION); // Check if image file is a actual image or fake image if(isset($_POST["kullanici_resmi_dosya_adi"])) { $check = getimagesize($_FILES["kullanici_resmi"]["tmp_name"]); if($check !== false) { $response["success"] = 1; $response["message"] = "File is an image - " . $check["mime"] . "."; echo json_encode($response); $uploadOk = 1; } else { $response["success"] = 0; $response["message"] = "File is not an image."; echo json_encode($response); $uploadOk = 0; } } // Check if file already exists if (file_exists($target_file)) { $response["success"] = 0; $response["message"] = "Sorry, file already exists."; echo json_encode($response); $uploadOk = 0; } // Check file size if ($_FILES["kullanici_resmi"]["size"] > 750000) { $response["success"] = 0; $response["message"] = "Sorry, your file is too large."; echo json_encode($response); $uploadOk = 0; } // Allow certain file formats if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg" && $imageFileType != "gif" ) { $response["success"] = 0; $response["message"] = "Sorry, only JPG, JPEG, PNG & GIF files are allowed."; echo json_encode($response); $uploadOk = 0; } // Check if $uploadOk is set to 0 by an error if ($uploadOk == 0) { $response["success"] = 0; $response["message"] = "Sorry, your file was not uploaded."; echo json_encode($response); // if everything is ok, try to upload file } else { if (move_uploaded_file($_FILES["kullanici_resmi"]["tmp_name"], $target_file)) { $response["success"] = 0; $response["message"] = "The file ". basename( $_FILES["kullanici_resmi"]["name"]). " has been uploaded."; echo json_encode($response); } else { $response["success"] = 0; $response["message"] = "Sorry, there was an error uploading your file."; echo json_encode($response); } } ?>
You must definitely send your file to this method,
private HttpEntity buildMultipartEntity(File file) { MultipartEntityBuilder builder = MultipartEntityBuilder.create(); String fileName = file.getName(); logYazdir("fileName : " + fileName); FileBody fileBody = new FileBody(file); builder.addPart(KEY_PICTURE, fileBody); builder.addTextBody(KEY_PICTURE_NAME, fileName); return builder.build(); }
and pay attention to it,
public static final String KEY_PICTURE = "kullanici_resmi";
kullanici_resmi
used in PHP code to specify an image file. I think you can send any file. Sorry for my bad explanations, I tried to explain everything.