Ich habe bereits eine Unterklasse von Request, die für HTTP-Post auf dem Server verwendet wird. Das Problem ist, ich habe keine Ahnung, wie ich einen Parameter für eine Datei hinzufügen kann. Das Veröffentlichen der Zeichenfolge auf dem Server ist einfach. aber ich muss Datei als einen anderen Parameter hinzufügen. Wie kann ich es tun?Wie hochzuladen Datei mit Volley-Bibliothek in Android?
public class AddNewPetRequest extends Request<JSONObject> {
private Response.Listener<JSONObject> listener;
public AddNewPetRequest(String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(Request.Method.GET, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
public AddNewPetRequest(int method, String url, Map<String, String> params,
Response.Listener<JSONObject> reponseListener, Response.ErrorListener errorListener) {
super(method, url, errorListener);
this.listener = reponseListener;
this.params = params;
}
protected Map<String, String> getParams()
throws com.android.volley.AuthFailureError {
return params;
};
@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
try {
String jsonString = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
return Response.success(new JSONObject(jsonString),
HttpHeaderParser.parseCacheHeaders(response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JSONException je) {
return Response.error(new ParseError(je));
}
}
@Override
protected void deliverResponse(JSONObject response) {
// TODO Auto-generated method stub
listener.onResponse(response);
}
}
UPDATE FRAGE: ich das Muster eines der Antworten hier in Stackoverflow folgen, und ich kam mit dieser Implementierung bis:
public class MultipartRequest extends Request<String> {
private MultipartEntity entity = new MultipartEntity();
private final Response.Listener<String> mListener;
private HashMap<String, String> mParams;
public MultipartRequest(String url, Response.ErrorListener errorListener, Response.Listener<String> listener)
{
super(Method.POST, url, errorListener);
mListener = listener;
buildMultipartEntity();
}
private void buildMultipartEntity()
{
entity.addPart("profile_picture", new FileBody(new File("/storage/emulated/0/Pictures/VSCOCam/2015-07-31 11.55.14 1.jpg")));
try
{
entity.addPart("user_id", new StringBody("15"));
entity.addPart("name", new StringBody("Bogs"));
entity.addPart("gender", new StringBody("Male"));
entity.addPart("date_birth", new StringBody("1999-12-5"));
entity.addPart("breed", new StringBody("monkey"));
}
catch (UnsupportedEncodingException e)
{
VolleyLog.e("UnsupportedEncodingException");
}
}
@Override
public String getBodyContentType()
{
return entity.getContentType().getValue();
}
@Override
public byte[] getBody() throws AuthFailureError
{
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try
{
entity.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());
}
@Override
protected void deliverResponse(String response)
{
mListener.onResponse(response);
}
Als ich diese Anfrage an meine Anfrage-Warteschlange hinzufügen, Es antwortet ein com.android.volley.TimeoutError, aber wenn eine Überprüfung der Datenbank, die Anfrage ausgeführt und Elemente zur Tabelle hinzufügen, aber das Profilbild Upload hat nur 1 Byte Größe. ein anderes Problem, mein Datenbankelement wurde zweimal hinzugefügt.
PROBLEM gelöst Ich habe dies bereits behoben, indem ich seine Anfragezeit eingestellt habe. was passiert ist, ich nicht in der Lage bin, die Antwort von meinem Server zu erhalten, nachdem das Standard-Timeout von Volley Bibliothek so mein Timeout durch den Aufruf und diese Methode, um meine Anfrage Queue Einstellung:
multipartRequest.setRetryPolicy(new DefaultRetryPolicy(1000 * 60, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
prüfen out: - http://stackoverflow.com/a/19981901/4018207 – AndiGeeky
Sie können [meine Frage und Antwort hier] lesen (http://stackoverflow.com/questions/32240177/working-post-multipart-request-with-volley-and-without-htpentiity). Hoffe das hilft! – BNK
@MamataGelanee Wie kann ich die MultipartEntity Klasse bekommen? Ich importiere dies durch meine Größe ** Kompiliergruppe: 'org.apache.httpcomponents', Name: 'httpclient-android' **, Version: '4.3.5.1' aber es scheint, dass MultipartEntity immer noch fehlt. –