studio - volley android example
Subir foto usando HttpPost MultiPartEntityBuilder (4)
Estoy tratando de subir la foto tomada al servidor. esto es lo que hago:
public JSONObject makePostFileRequest(String url, String photoFile) {
try {
// photoFile = /path/tofile/pic.jpg
DefaultHttpClient httpClient = GlobalData.httpClient;
HttpPost httpPost = new HttpPost(url);
File file = new File(photoFile);
FileBody fileBody = new FileBody(file); // here is line 221
MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("PhotoMessage", fileBody);
httpPost.setEntity(multipartEntity.build());
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
Me sale este error:
11-29 13: 12: 14.924: E / AndroidRuntime (15781): Causado por: java.lang.NoClassDefFoundError: org.apache.http.entity.ContentType 11-29 13: 12: 14.924: E / Android Runtime (15781): en org.apache.http.entity.mime.content.FileBody. (FileBody.java:89) 11-29 13: 12: 14.924: E / AndroidRuntime (15781): en com.petcial.petopen.custom.JSONParser.makePostFileRequest (JSONParser.java:221)
¿Qué estoy haciendo mal?
Actualizar
InputStream inputStream;
inputStream = new FileInputStream(new File(photoFile));
byte[] data;
data = IOUtils.toByteArray(inputStream);
httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
System.getProperty("http.agent"));
InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), "Pic.jpg");
MultipartEntityBuilder multipartEntity = MultipartEntityBuilder.create();
multipartEntity.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
multipartEntity.addPart("PhotoMessage", inputStreamBody);
httpPost.setEntity(multipartEntity.build());
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
Aquí está el error:
11-29 14: 00: 33.364: E / AndroidRuntime (19478): Causado por: java.lang.NoClassDefFoundError: org.apache.http.util.Args 11-29 14: 00: 33.364: E / Android Runtime (19478): en org.apache.http.entity.mime.content.AbstractContentBody. (AbstractContentBody.java:48) 11-29 14: 00: 33.364: E / AndroidRuntime (19478): en org.apache.http.entity.mime.content .InputStreamBody. (InputStreamBody.java:69) 11-29 14: 00: 33.364: E / AndroidRuntime (19478): en org.apache.http.entity.mime.content.InputStreamBody. (InputStreamBody.java:62) 11- 29 14: 00: 33.364: E / AndroidRuntime (19478): en com.petcial.petopen.custom.JSONParser.makePostFileRequest (JSONParser.java:233)
estas bibliotecas resolvieron mi problema:
Mejor pasas la ruta del archivo de imagen. Abajo está mi código que usé para subir la imagen al servidor.
public class UploadProductDetails {
public void uploadProductDetails(String filePath, String fileName)
{
InputStream inputStream;
try
{
inputStream = new FileInputStream(new File(filePath));
byte[] data;
try
{
data = IOUtils.toByteArray(inputStream);
HttpClient httpClient = new DefaultHttpClient();
httpClient.getParams().setParameter(CoreProtocolPNames.USER_AGENT,
System.getProperty("http.agent"));
HttpPost httpPost = new HttpPost("http://ipaddress");
InputStreamBody inputStreamBody = new InputStreamBody(new ByteArrayInputStream(data), "abc.png");
MultipartEntity multipartEntity = new MultipartEntity();
multipartEntity.addPart("file", inputStreamBody);
httpPost.setEntity(multipartEntity);
HttpResponse httpResponse = httpClient.execute(httpPost);
// Handle response back from script.
if(httpResponse != null) {
//Toast.makeText(getBaseContext(), "Upload Completed. ", 2000).show();
} else { // Error, no response.
//Toast.makeText(getBaseContext(), "Server Error. ", 2000).show();
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
}
}
Mi solución de trabajo es enviar imágenes con publicaciones, usar las bibliotecas http de apache (muy importante aquí es agregar límites No funcionará sin ella en mi conexión):
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
byte[] imageBytes = baos.toByteArray();
HttpClient httpclient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(StaticData.AMBAJE_SERVER_URL + StaticData.AMBAJE_ADD_AMBAJ_TO_GROUP);
String boundary = "-------------" + System.currentTimeMillis();
httpPost.setHeader("Content-type", "multipart/form-data; boundary="+boundary);
ByteArrayBody bab = new ByteArrayBody(imageBytes, "pic.png");
StringBody sbOwner = new StringBody(StaticData.loggedUserId, ContentType.TEXT_PLAIN);
StringBody sbGroup = new StringBody("group", ContentType.TEXT_PLAIN);
HttpEntity entity = MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.setBoundary(boundary)
.addPart("group", sbGroup)
.addPart("owner", sbOwner)
.addPart("image", bab)
.build();
httpPost.setEntity(entity);
try {
HttpResponse response = httpclient.execute(httpPost);
...then reading response
Tenga en cuenta que el uso de este código: new InputStreamBody(new ByteArrayInputStream(yourByteArray))
puede ocasionar algunos problemas, porque devuelve -1
al llamar a getContentLength()
.
En su lugar, use esto: new ByteArrayBody(yourByteArray)
Verifique ese tarro en la pestaña Ordenar y exportar y ejecute.