import android.graphics.Bitmap; | |
import android.graphics.drawable.BitmapDrawable; | |
import android.graphics.drawable.Drawable; | |
import java.io.ByteArrayOutputStream; | |
/** | |
* Sketch Project Studio | |
* Created by Angga on 12/04/2016 14.27. | |
*/ | |
public class AppHelper { | |
/** | |
* Turn drawable resource into byte array. | |
* | |
* @param context parent context | |
* @param id drawable resource id | |
* @return byte array | |
*/ | |
public static byte[] getFileDataFromDrawable(Context context, int id) { | |
Drawable drawable = ContextCompat.getDrawable(context, id); | |
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); | |
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | |
bitmap.compress(Bitmap.CompressFormat.PNG, 0, byteArrayOutputStream); | |
return byteArrayOutputStream.toByteArray(); | |
} | |
/** | |
* Turn drawable into byte array. | |
* | |
* @param drawable data | |
* @return byte array | |
*/ | |
public static byte[] getFileDataFromDrawable(Context context, Drawable drawable) { | |
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); | |
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | |
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, byteArrayOutputStream); | |
return byteArrayOutputStream.toByteArray(); | |
} | |
} |
/** | |
* Sketch Project Studio | |
* Created by Angga 20/04/2016 19:32 | |
*/ | |
public class MainActivity extends AppCompatActivity { | |
private EditText mNameInput; | |
private EditText mLocationInput; | |
private EditText mAboutInput; | |
private EditText mContact; | |
private ImageView mAvatarImage; | |
private ImageView mCoverImage; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_main); | |
mNameInput = (EditText) findViewById(R.id.input_name); | |
mLocationInput = (EditText) findViewById(R.id.input_location); | |
mAboutInput = (EditText) findViewById(R.id.input_about); | |
mContact = (EditText) findViewById(R.id.input_contact); | |
mAvatarImage = (ImageView) findViewById(R.id.avatar); | |
mCoverImage = (ImageView) findViewById(R.id.cover); | |
// do anything before post data.. or triggered after button clicked | |
saveProfileAccount(); | |
} | |
private void saveProfileAccount() { | |
// loading or check internet connection or something... | |
// ... then | |
String url = "http://www.angga-ari.com/api/something/awesome"; | |
VolleyMultipartRequest multipartRequest = new VolleyMultipartRequest(Request.Method.POST, url, new Response.Listener<NetworkResponse>() { | |
@Override | |
public void onResponse(NetworkResponse response) { | |
String resultResponse = new String(response.data); | |
try { | |
JSONObject result = new JSONObject(resultResponse); | |
String status = result.getString("status"); | |
String message = result.getString("message"); | |
if (status.equals(Constant.REQUEST_SUCCESS)) { | |
// tell everybody you have succed upload image and post strings | |
Log.i("Messsage", message); | |
} else { | |
Log.i("Unexpected", message); | |
} | |
} catch (JSONException e) { | |
e.printStackTrace(); | |
} | |
} | |
}, new Response.ErrorListener() { | |
@Override | |
public void onErrorResponse(VolleyError error) { | |
NetworkResponse networkResponse = error.networkResponse; | |
String errorMessage = "Unknown error"; | |
if (networkResponse == null) { | |
if (error.getClass().equals(TimeoutError.class)) { | |
errorMessage = "Request timeout"; | |
} else if (error.getClass().equals(NoConnectionError.class)) { | |
errorMessage = "Failed to connect server"; | |
} | |
} else { | |
String result = new String(networkResponse.data); | |
try { | |
JSONObject response = new JSONObject(result); | |
String status = response.getString("status"); | |
String message = response.getString("message"); | |
Log.e("Error Status", status); | |
Log.e("Error Message", message); | |
if (networkResponse.statusCode == 404) { | |
errorMessage = "Resource not found"; | |
} else if (networkResponse.statusCode == 401) { | |
errorMessage = message+" Please login again"; | |
} else if (networkResponse.statusCode == 400) { | |
errorMessage = message+ " Check your inputs"; | |
} else if (networkResponse.statusCode == 500) { | |
errorMessage = message+" Something is getting wrong"; | |
} | |
} catch (JSONException e) { | |
e.printStackTrace(); | |
} | |
} | |
Log.i("Error", errorMessage); | |
error.printStackTrace(); | |
} | |
}) { | |
@Override | |
protected Map<String, String> getParams() { | |
Map<String, String> params = new HashMap<>(); | |
params.put("api_token", "gh659gjhvdyudo973823tt9gvjf7i6ric75r76"); | |
params.put("name", mNameInput.getText().toString()); | |
params.put("location", mLocationInput.getText().toString()); | |
params.put("about", mAboutInput.getText().toString()); | |
params.put("contact", mContactInput.getText().toString()); | |
return params; | |
} | |
@Override | |
protected Map<String, DataPart> getByteData() { | |
Map<String, DataPart> params = new HashMap<>(); | |
// file name could found file base or direct access from real path | |
// for now just get bitmap data from ImageView | |
params.put("avatar", new DataPart("file_avatar.jpg", AppHelper.getFileDataFromDrawable(getBaseContext(), mAvatarImage.getDrawable()), "image/jpeg")); | |
params.put("cover", new DataPart("file_cover.jpg", AppHelper.getFileDataFromDrawable(getBaseContext(), mCoverImage.getDrawable()), "image/jpeg")); | |
return params; | |
} | |
}; | |
VolleySingleton.getInstance(getBaseContext()).addToRequestQueue(multipartRequest); | |
} | |
} |
package com.sketchproject.infogue.modules; | |
import com.android.volley.AuthFailureError; | |
import com.android.volley.NetworkResponse; | |
import com.android.volley.ParseError; | |
import com.android.volley.Request; | |
import com.android.volley.Response; | |
import com.android.volley.VolleyError; | |
import com.android.volley.toolbox.HttpHeaderParser; | |
import java.io.ByteArrayInputStream; | |
import java.io.ByteArrayOutputStream; | |
import java.io.DataOutputStream; | |
import java.io.IOException; | |
import java.io.UnsupportedEncodingException; | |
import java.util.Map; | |
/** | |
* Custom request to make multipart header and upload file. | |
* | |
* Sketch Project Studio | |
* Created by Angga on 27/04/2016 12.05. | |
*/ | |
public class VolleyMultipartRequest extends Request<NetworkResponse> { | |
private final String twoHyphens = "--"; | |
private final String lineEnd = "\r\n"; | |
private final String boundary = "apiclient-" + System.currentTimeMillis(); | |
private Response.Listener<NetworkResponse> mListener; | |
private Response.ErrorListener mErrorListener; | |
private Map<String, String> mHeaders; | |
/** | |
* Default constructor with predefined header and post method. | |
* | |
* @param url request destination | |
* @param headers predefined custom header | |
* @param listener on success achieved 200 code from request | |
* @param errorListener on error http or library timeout | |
*/ | |
public VolleyMultipartRequest(String url, Map<String, String> headers, | |
Response.Listener<NetworkResponse> listener, | |
Response.ErrorListener errorListener) { | |
super(Method.POST, url, errorListener); | |
this.mListener = listener; | |
this.mErrorListener = errorListener; | |
this.mHeaders = headers; | |
} | |
/** | |
* Constructor with option method and default header configuration. | |
* | |
* @param method method for now accept POST and GET only | |
* @param url request destination | |
* @param listener on success event handler | |
* @param errorListener on error event handler | |
*/ | |
public VolleyMultipartRequest(int method, String url, | |
Response.Listener<NetworkResponse> listener, | |
Response.ErrorListener errorListener) { | |
super(method, url, errorListener); | |
this.mListener = listener; | |
this.mErrorListener = errorListener; | |
} | |
@Override | |
public Map<String, String> getHeaders() throws AuthFailureError { | |
return (mHeaders != null) ? mHeaders : super.getHeaders(); | |
} | |
@Override | |
public String getBodyContentType() { | |
return "multipart/form-data;boundary=" + boundary; | |
} | |
@Override | |
public byte[] getBody() throws AuthFailureError { | |
ByteArrayOutputStream bos = new ByteArrayOutputStream(); | |
DataOutputStream dos = new DataOutputStream(bos); | |
try { | |
// populate text payload | |
Map<String, String> params = getParams(); | |
if (params != null && params.size() > 0) { | |
textParse(dos, params, getParamsEncoding()); | |
} | |
// populate data byte payload | |
Map<String, DataPart> data = getByteData(); | |
if (data != null && data.size() > 0) { | |
dataParse(dos, data); | |
} | |
// close multipart form data after text and file data | |
dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); | |
return bos.toByteArray(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
/** | |
* Custom method handle data payload. | |
* | |
* @return Map data part label with data byte | |
* @throws AuthFailureError | |
*/ | |
protected Map<String, DataPart> getByteData() throws AuthFailureError { | |
return null; | |
} | |
@Override | |
protected Response<NetworkResponse> parseNetworkResponse(NetworkResponse response) { | |
try { | |
return Response.success( | |
response, | |
HttpHeaderParser.parseCacheHeaders(response)); | |
} catch (Exception e) { | |
return Response.error(new ParseError(e)); | |
} | |
} | |
@Override | |
protected void deliverResponse(NetworkResponse response) { | |
mListener.onResponse(response); | |
} | |
@Override | |
public void deliverError(VolleyError error) { | |
mErrorListener.onErrorResponse(error); | |
} | |
/** | |
* Parse string map into data output stream by key and value. | |
* | |
* @param dataOutputStream data output stream handle string parsing | |
* @param params string inputs collection | |
* @param encoding encode the inputs, default UTF-8 | |
* @throws IOException | |
*/ | |
private void textParse(DataOutputStream dataOutputStream, Map<String, String> params, String encoding) throws IOException { | |
try { | |
for (Map.Entry<String, String> entry : params.entrySet()) { | |
buildTextPart(dataOutputStream, entry.getKey(), entry.getValue()); | |
} | |
} catch (UnsupportedEncodingException uee) { | |
throw new RuntimeException("Encoding not supported: " + encoding, uee); | |
} | |
} | |
/** | |
* Parse data into data output stream. | |
* | |
* @param dataOutputStream data output stream handle file attachment | |
* @param data loop through data | |
* @throws IOException | |
*/ | |
private void dataParse(DataOutputStream dataOutputStream, Map<String, DataPart> data) throws IOException { | |
for (Map.Entry<String, DataPart> entry : data.entrySet()) { | |
buildDataPart(dataOutputStream, entry.getValue(), entry.getKey()); | |
} | |
} | |
/** | |
* Write string data into header and data output stream. | |
* | |
* @param dataOutputStream data output stream handle string parsing | |
* @param parameterName name of input | |
* @param parameterValue value of input | |
* @throws IOException | |
*/ | |
private void buildTextPart(DataOutputStream dataOutputStream, String parameterName, String parameterValue) throws IOException { | |
dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); | |
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + parameterName + "\"" + lineEnd); | |
//dataOutputStream.writeBytes("Content-Type: text/plain; charset=UTF-8" + lineEnd); | |
dataOutputStream.writeBytes(lineEnd); | |
dataOutputStream.writeBytes(parameterValue + lineEnd); | |
} | |
/** | |
* Write data file into header and data output stream. | |
* | |
* @param dataOutputStream data output stream handle data parsing | |
* @param dataFile data byte as DataPart from collection | |
* @param inputName name of data input | |
* @throws IOException | |
*/ | |
private void buildDataPart(DataOutputStream dataOutputStream, DataPart dataFile, String inputName) throws IOException { | |
dataOutputStream.writeBytes(twoHyphens + boundary + lineEnd); | |
dataOutputStream.writeBytes("Content-Disposition: form-data; name=\"" + | |
inputName + "\"; filename=\"" + dataFile.getFileName() + "\"" + lineEnd); | |
if (dataFile.getType() != null && !dataFile.getType().trim().isEmpty()) { | |
dataOutputStream.writeBytes("Content-Type: " + dataFile.getType() + lineEnd); | |
} | |
dataOutputStream.writeBytes(lineEnd); | |
ByteArrayInputStream fileInputStream = new ByteArrayInputStream(dataFile.getContent()); | |
int bytesAvailable = fileInputStream.available(); | |
int maxBufferSize = 1024 * 1024; | |
int bufferSize = Math.min(bytesAvailable, maxBufferSize); | |
byte[] buffer = new byte[bufferSize]; | |
int bytesRead = fileInputStream.read(buffer, 0, bufferSize); | |
while (bytesRead > 0) { | |
dataOutputStream.write(buffer, 0, bufferSize); | |
bytesAvailable = fileInputStream.available(); | |
bufferSize = Math.min(bytesAvailable, maxBufferSize); | |
bytesRead = fileInputStream.read(buffer, 0, bufferSize); | |
} | |
dataOutputStream.writeBytes(lineEnd); | |
} | |
/** | |
* Simple data container use for passing byte file | |
*/ | |
public class DataPart { | |
private String fileName; | |
private byte[] content; | |
private String type; | |
/** | |
* Default data part | |
*/ | |
public DataPart() { | |
} | |
/** | |
* Constructor with data. | |
* | |
* @param name label of data | |
* @param data byte data | |
*/ | |
public DataPart(String name, byte[] data) { | |
fileName = name; | |
content = data; | |
} | |
/** | |
* Constructor with mime data type. | |
* | |
* @param name label of data | |
* @param data byte data | |
* @param mimeType mime data like "image/jpeg" | |
*/ | |
public DataPart(String name, byte[] data, String mimeType) { | |
fileName = name; | |
content = data; | |
type = mimeType; | |
} | |
/** | |
* Getter file name. | |
* | |
* @return file name | |
*/ | |
public String getFileName() { | |
return fileName; | |
} | |
/** | |
* Setter file name. | |
* | |
* @param fileName string file name | |
*/ | |
public void setFileName(String fileName) { | |
this.fileName = fileName; | |
} | |
/** | |
* Getter content. | |
* | |
* @return byte file data | |
*/ | |
public byte[] getContent() { | |
return content; | |
} | |
/** | |
* Setter content. | |
* | |
* @param content byte file data | |
*/ | |
public void setContent(byte[] content) { | |
this.content = content; | |
} | |
/** | |
* Getter mime type. | |
* | |
* @return mime type | |
*/ | |
public String getType() { | |
return type; | |
} | |
/** | |
* Setter mime type. | |
* | |
* @param type mime type | |
*/ | |
public void setType(String type) { | |
this.type = type; | |
} | |
} | |
} |
package com.sketchproject.infogue.modules; | |
import android.content.Context; | |
import android.graphics.Bitmap; | |
import android.support.v4.util.LruCache; | |
import com.android.volley.Request; | |
import com.android.volley.RequestQueue; | |
import com.android.volley.toolbox.ImageLoader; | |
import com.android.volley.toolbox.Volley; | |
/** | |
* Singleton volley to populate request into single queue. | |
* | |
* Sketch Project Studio | |
* Created by Angga on 22/04/2016 22.58. | |
*/ | |
public class VolleySingleton { | |
private static VolleySingleton mInstance; | |
private RequestQueue mRequestQueue; | |
private ImageLoader mImageLoader; | |
private static Context mCtx; | |
/** | |
* Private constructor, only initialization from getInstance. | |
* | |
* @param context parent context | |
*/ | |
private VolleySingleton(Context context) { | |
mCtx = context; | |
mRequestQueue = getRequestQueue(); | |
mImageLoader = new ImageLoader(mRequestQueue, | |
new ImageLoader.ImageCache() { | |
private final LruCache<String, Bitmap> cache = new LruBitmapCache(mCtx); | |
@Override | |
public Bitmap getBitmap(String url) { | |
return cache.get(url); | |
} | |
@Override | |
public void putBitmap(String url, Bitmap bitmap) { | |
cache.put(url, bitmap); | |
} | |
}); | |
} | |
/** | |
* Singleton construct design pattern. | |
* | |
* @param context parent context | |
* @return single instance of VolleySingleton | |
*/ | |
public static synchronized VolleySingleton getInstance(Context context) { | |
if (mInstance == null) { | |
mInstance = new VolleySingleton(context); | |
} | |
return mInstance; | |
} | |
/** | |
* Get current request queue. | |
* | |
* @return RequestQueue | |
*/ | |
public RequestQueue getRequestQueue() { | |
if (mRequestQueue == null) { | |
// getApplicationContext() is key, it keeps you from leaking the | |
// Activity or BroadcastReceiver if someone passes one in. | |
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); | |
} | |
return mRequestQueue; | |
} | |
/** | |
* Add new request depend on type like string, json object, json array request. | |
* | |
* @param req new request | |
* @param <T> request type | |
*/ | |
public <T> void addToRequestQueue(Request<T> req) { | |
getRequestQueue().add(req); | |
} | |
/** | |
* Get image loader. | |
* | |
* @return ImageLoader | |
*/ | |
public ImageLoader getImageLoader() { | |
return mImageLoader; | |
} | |
} |
This comment has been minimized.
This comment has been minimized.
came across your gist while searching on the web. i have a question though, how is the image sent to a server? in byte array or base64? |
This comment has been minimized.
This comment has been minimized.
I came a cross your gist on stackover flow, I must say its well done, it has really eased my work. Many thanks |
This comment has been minimized.
This comment has been minimized.
ray86 is the normal way you handle multipart data from a normal form on the web. I am using REST Api library on code igniter framework. |
This comment has been minimized.
This comment has been minimized.
@ray86 No, this code does not convert images or file into string, you just treat the file like web form,, the idea build multipart data header,, it's similar you upload file as well.. |
This comment has been minimized.
This comment has been minimized.
First of all, thanks. Great code! Now my question: Is there any way to send multiple files at once with the same name? |
This comment has been minimized.
This comment has been minimized.
@inlacou you can change file name in php code. |
This comment has been minimized.
This comment has been minimized.
this is great @anggadarkprince !! I have one question, can you add the LruBitmapCache.java? |
This comment has been minimized.
This comment has been minimized.
datafile.getContent() is returning null to me |
This comment has been minimized.
This comment has been minimized.
i need progress count for inform user there is any idea to do this inside VolleyMultipartRequest.java |
This comment has been minimized.
This comment has been minimized.
Dear but there is a little problem for me BTW |
This comment has been minimized.
This comment has been minimized.
@db0910 try to uncomment the encoding code |
This comment has been minimized.
This comment has been minimized.
@abdulahad1991 you must passing byte data via setter method or constructor, i just give an example retrieve image byte data from drawable content, please explore how you could improvise depends on your cases.. |
This comment has been minimized.
This comment has been minimized.
Dear @anggadarkprince In the "buildTextPart" subroutine to and I don't uncomment the encoding code thanks for yout perfect code |
This comment has been minimized.
This comment has been minimized.
@db0910 oh i see, i'm glad for you too you found the solution, |
This comment has been minimized.
This comment has been minimized.
can we determine progress of request |
This comment has been minimized.
This comment has been minimized.
Thank you for showing how to do this. |
This comment has been minimized.
This comment has been minimized.
@anggadarkprince |
This comment has been minimized.
This comment has been minimized.
Awesome code. This is gold. |
This comment has been minimized.
This comment has been minimized.
I used your gist with some editions. |
This comment has been minimized.
This comment has been minimized.
@db0910 Thank you for this. |
This comment has been minimized.
This comment has been minimized.
How could we send data from a phone camera intent, or a file on the phone? Your only example (it seems) is getting the byte data from a "drawable". Is that really the most common use case of this code? I admit I'm new to posting multipart data over the network in Android. Would it start with sending in file_name as a String, and then: |
This comment has been minimized.
This comment has been minimized.
@anggadarkprince I'm new to android development and would like to ask if this code can handle audio or video stream to upload to server? Thanks a lot to answer my own question... yep, it can support audio and video |
This comment has been minimized.
This comment has been minimized.
@db0910 - Thanks! you saved my day. |
This comment has been minimized.
This comment has been minimized.
Hi nice description. When I tried with this by sending json in value of hashMap I got multipart boundry not supported. I do not understand is there any problem at app side to send or to receive at back end side. So please can you send how to receive json & multipart body at server side? |
This comment has been minimized.
This comment has been minimized.
@db0910 Thank you so much! |
This comment has been minimized.
This comment has been minimized.
Thank you !!! |
This comment has been minimized.
This comment has been minimized.
Awsom work |
This comment has been minimized.
This comment has been minimized.
I have issues on how to receive the file at my server side. can anyone help me with a php sample? |
This comment has been minimized.
This comment has been minimized.
Its good for image file. But can't get for uploading videos. How will video file will get uploaded from VideoView? |
This comment has been minimized.
This comment has been minimized.
Thank you, it works for me |
This comment has been minimized.
This comment has been minimized.
Hi... I liked your code and it worked very well for me. But I wanted to get files stored on External Storage, so I changed to get files via Uri.
|
This comment has been minimized.
This comment has been minimized.
After searching for what felt like a lifetime, I found this post and it worked like a charm. All I can say is THANK YOU |
This comment has been minimized.
This comment has been minimized.
can i upload audia, video and multiple images using this code?? |
This comment has been minimized.
This comment has been minimized.
Just wanted to leave a big thanks for sharing. This really helped want I wanted to do. |
This comment has been minimized.
This comment has been minimized.
I got this NoConnectionError: java.io.IOException: unexpected end of stream on Connection, while uploading image and video. What could be the possible solution? Here is the more detail about the problem http://stackoverflow.com/q/43977319/5255006. |
This comment has been minimized.
This comment has been minimized.
@anggadarkprince , THANK YOU A LOT! First Really Working Solution which was worked for me. You solved my biggest problem. Thanx! |
This comment has been minimized.
This comment has been minimized.
Just wanted to check if anyone is able to upload video from Uri? If possible please share some sample. able to do by converting to ByteArray `ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
This comment has been minimized.
This comment has been minimized.
Many thanks for your code! It has saved my day! |
This comment has been minimized.
This comment has been minimized.
Thank you, Thank you, Thank you...... New to Java and Android world and after many attempts to transmit image to service with no success, this has help more than you can imagine, works like a charm... |
This comment has been minimized.
This comment has been minimized.
hello, I am getting an error on this line. Cannot resolve symbol "LruBitmapCache" Thanks in advance |
This comment has been minimized.
This comment has been minimized.
@db0910 and @anggadarkprince thank you very much for your support and your code you two really saved my day , thankkkkkkkkkkkkkk youuuuuuuuuuu :* |
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
Thanks a lot |
This comment has been minimized.
This comment has been minimized.
is this code will upload pdf document as well?? |
This comment has been minimized.
This comment has been minimized.
Hi this request work in activity but doesn't work in Fragment. How can i do in Fragment ? |
This comment has been minimized.
This comment has been minimized.
How to show progress, that how much data is uploaded? |
This comment has been minimized.
This comment has been minimized.
@anggadarkprince how can i getByteData of images when i only have Arraylist < Uri > of images / String array of imagePaths ? Is it okay to retrive byte data from images like this or there are better ways ?
The error iam facing while trying to upload image
Here is the github link to complete project code https://github.com/sooorajjj/vstImageClassifier Thanks! |
This comment has been minimized.
This comment has been minimized.
Error:(40, 87) error: incompatible types: Context cannot be converted to int |
This comment has been minimized.
This comment has been minimized.
Hi, I get EOFException. What can It be due to? Thanks |
This comment has been minimized.
This comment has been minimized.
@db0910 in VolleyMultipartRequest::buildTextPart(). Maybe the gist can be updated? (Should parameterName be encoded too b.t.w. ?) And |
This comment has been minimized.
This comment has been minimized.
Great !!! |
This comment has been minimized.
This comment has been minimized.
Thank you it worked fine |
This comment has been minimized.
This comment has been minimized.
Thank you so much¡¡¡ Great Code |
This comment has been minimized.
This comment has been minimized.
Hi, Thank you so much form amazing code! As reported by https://developer.android.com/reference/android/util/LruCache.html |
This comment has been minimized.
This comment has been minimized.
Hi,Thanks for a great tutorial . But i am facing an issue , I have implemented this in a fragment and whenever i upload an image it successfully uploads to the server but after doing fragment transition it is showing previous selected image in the image view. Please help me. |
This comment has been minimized.
This comment has been minimized.
Thank you very much. Much appreciated |
This comment has been minimized.
This comment has been minimized.
Hi everyone, m newbie to this library, will anyone can tell me, I want to attach a filename and filedata( as bas64 string) inside the JSONRequest. How can I update this solution? Thanks in advance. |
This comment has been minimized.
This comment has been minimized.
Not working for images whose name is something like "/storage/emulated/0/Download/God of Hollywood industry - JackSparrow @jhonnydeppoffical • • • • • Follow me @s.jpg" how to solve this issue ? |
This comment has been minimized.
This comment has been minimized.
getparams() is not working, anyone fix it ??? server never receives my params! |
This comment has been minimized.
This comment has been minimized.
Thank you very much.Its perfectly working (Y) |
This comment has been minimized.
This comment has been minimized.
Thanky you! |
This comment has been minimized.
This comment has been minimized.
Getting an error in : Do I need to create a "Constant" class? |
This comment has been minimized.
This comment has been minimized.
Wow thanks!! Great code, you saved me a lot of time! |
This comment has been minimized.
This comment has been minimized.
works like a charm thank you!! |
This comment has been minimized.
This comment has been minimized.
thanks a lot. I didn't use it for uploading an image, I used it to send data to a server and it worked fine. |
This comment has been minimized.
This comment has been minimized.
Hello Sir i want backend code of PHP(webservice) through which images are going to upload to server |
This comment has been minimized.
This comment has been minimized.
Awesome code. Thanks a lot. @anggadarkprince : Is there any way to send multiple files at once with the same name? Because currently it is not working with same keyname. e.g.
Please provide any solution for this problem. |
This comment has been minimized.
This comment has been minimized.
how to send pdf file please anyone help me i m getting size = 0 while uploading file to server any one show the code to send pdf file |
This comment has been minimized.
This comment has been minimized.
This code works really well, however I have only a small issue with it: This can be done by replacing the second line in the "buildDataPart" method with the following:
|
This comment has been minimized.
This comment has been minimized.
I have huge problem and i don't know how to fix it. My server is looking for File=file(in postman when i make call i have to put key "File" and value is file) how i Can send it? In multipart was something like builder.addFormDataPart("file", "image.jpg", RequestBody.create(MediaType.parse("image/jpeg"), byteArray.toByteArray())); But there is no such thinks ;/ |
This comment has been minimized.
This comment has been minimized.
I have a problem with words with accents, for example mamá, It gives an error if I send that, that's why what I'm doing is removing that accent. ¿Is there any solution for this? |
This comment has been minimized.
This comment has been minimized.
you didn't set content type in constructor of DataPart, thus content type is null |
This comment has been minimized.
This comment has been minimized.
Great code... Thank you |
This comment has been minimized.
This comment has been minimized.
Getting an error in : Do I need to create a "Constant" class? |
This comment has been minimized.
This comment has been minimized.
Hi I used this working perfectly but on P is not working any help will me more helpful |
This comment has been minimized.
This comment has been minimized.
Awesome code. This works like a charm and saved a lot of my time. Thanks a lot. |
This comment has been minimized.
This comment has been minimized.
Thank you so much! |
This comment has been minimized.
This comment has been minimized.
How can i retrieve the send data via my php code?? |
This comment has been minimized.
This comment has been minimized.
I made a fork based on the good answer by @db0910 to support UTF-8 .. Thanks @anggadarkprince for providing the gist in the first place |
This comment has been minimized.
This comment has been minimized.
Hey how do i get the send data via the php ?? |
This comment has been minimized.
This comment has been minimized.
Does anyone have an issue with emojis? |
This comment has been minimized.
This comment has been minimized.
@Mr-Ramzan it might be a utf-8 issue, not sure, but try the fork I made earlier to handle the utf-8 encoding |
This comment has been minimized.
This comment has been minimized.
Hola amigo @anggadarkprince estoy tratando de adaptar la clase VolleyMultipart a una llamada VolleyArrayMultipart para poder subir un array de archivos. Te agradezco de antemano si podrías darme algunas indicaciones. |
This comment has been minimized.
This comment has been minimized.
Thank You For this code.But i am getting this message.can any one help me. |
This comment has been minimized.
This comment has been minimized.
replace "Constant.REQUEST_SUCCESS" that with the success message returned by your server |
This comment has been minimized.
This comment has been minimized.
Bro, you're an actual lifesaver, I've looked everywhere for this, Such a clean and well-commented solution, you're amazing |
This comment has been minimized.
This comment has been minimized.
Hey, thank you so much. at MainActivity.java, line 98 |
This comment has been minimized.
After read bunch of articles and stack overflow questions, I tried wrap up solution and it works perfectly, thanks to all indirect contributors, I rewrite their code, more modular and easy to use. All related code inspired by
http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-httpentity
http://stackoverflow.com/questions/16797468/how-to-send-a-multipart-form-data-post-in-android-with-volley
http://stackoverflow.com/questions/32187450/trouble-sending-multipart-file-with-boundary-via-volley
try and give me feedback.