Como enviar imagem para um WebService ?

1,616 views
Skip to first unread message

Diogo Henrique

unread,
May 26, 2013, 5:40:36 PM5/26/13
to androidb...@googlegroups.com
Olá pessoal, estou precisando enviar uma imagem tirada da câmera para um Web Service. Esse Web Service já existe, eu mesmo o criei e tal mas nunca foi necessario receber uma imagem. Pesquisando eu encontrei o esse link http://www.decom.ufop.br/imobilis/?p=889 ele ensina como mandar uma imagem para o Web Service, mas não fala o que fazer no Web Service para receber essa image. Alguém já passou por isso ? Meu Web Service e RESTFul.



Diogo Henrique
(83)87344178
Rede Sociais: 




Jonas Alves

unread,
May 26, 2013, 5:59:28 PM5/26/13
to androidb...@googlegroups.com

A solução deste link é absurda. Não faça desse jeito. Ele codifica conteúdo binário em Base64, e isso vai causar vários problemas: gasta mais processamento do que deveria, gasta mais transferência do que deveria, gasta mais tempo do que deveria, e provavelmente outros problemas que não lembro agora.

Com HTTP, você deve enviar imagens como body da sua request, ou como um item de um body multipart.
Como, exatamente, fazer isso, vai depender da biblioteca que você está usando para fazer a requisição HTTP.

O procedimento para o webservice ler a imagem recebida depende do framework que você usa.

--
You received this message because you are subscribed to the Google Groups "Android Brasil - Dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email to androidbrasil-...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Diego Lopes Marques da Silva

unread,
May 26, 2013, 7:46:23 PM5/26/13
to androidb...@googlegroups.com

Eu resolvi utilizando multipart

Thiago Catoto

unread,
May 26, 2013, 7:48:47 PM5/26/13
to androidb...@googlegroups.com

O WS eh em Java? Vc fez usando algum framework?

-- Catoto

On May 26, 2013 6:40 PM, "Diogo Henrique" <diog...@gmail.com> wrote:

Diogo Henrique

unread,
May 27, 2013, 9:17:32 AM5/27/13
to androidb...@googlegroups.com
@Jonas,@Thiago eu não usei nenhum framework para fazer o Web Service. Eu utilizo o Jax-RS e Jersey. O Web Service e em Java sim, eu usei tutorial do antunes do Portal Android... segue o link http://www.portalandroid.org/comunidade/viewtopic.php?f=7&t=17389

@Diego, você tem o link pra compartilhar ? Eu achei esse aqui http://puspendu.wordpress.com/2012/08/23/restful-webservice-file-upload-with-jersey/ poderia ser uma solução ?

Diego Lopes Marques da Silva

unread,
May 27, 2013, 9:34:20 AM5/27/13
to androidb...@googlegroups.com
Exatemente Diogo.

Pode seguir por ai.

Thiago Catoto

unread,
May 27, 2013, 10:07:19 AM5/27/13
to androidb...@googlegroups.com
Diogo,

Tá fácil! =D

"Keep it up!"

-- Catoto


2013/5/27 Diogo Henrique <diog...@gmail.com>

Diogo Henrique

unread,
May 27, 2013, 2:15:15 PM5/27/13
to androidb...@googlegroups.com
Vai @Diego vou testar isso =D
@Thiago kkkkkk porque ta fácil ? E só aplicar o multiplart ? 

Diogo Henrique

unread,
May 27, 2013, 8:50:43 PM5/27/13
to androidb...@googlegroups.com


            @POST
   @Consumes(MediaType.MULTIPART_FORM_DATA)
   public Response uploadFile(
       @FormDataParam("file") InputStream uploadedInputStream,
       @FormDataParam("file") FormDataContentDisposition fileDetail) {
 
       String uploadedFileLocation = "c://uploadedFiles/" + fileDetail.getFileName();
 
       // save it
       saveToFile(uploadedInputStream, uploadedFileLocation);
 
       String output = "File uploaded via Jersey based RESTFul Webservice to: " + uploadedFileLocation;
 
       return Response.status(200).entity(output).build();
 
   }



Mais como eu passaria essa imagem para esse método do Web Service ? Nesse Web Service que uso eu passo um objeto via JSON. Como eu vou mandar um Objeto com suas informações + a imagem ? tem como ?
No Android eu pego a imagem assim... logo quando o cara tira a foto....

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] imageData, Camera c) {

if (imageData != null) {
BitmapFactory.Options options=new BitmapFactory.Options();
                 options.inSampleSize = 5;
Bitmap myImage = BitmapFactory.decodeByteArray(imageData, 0,
                         imageData.length,options);
FileUtilities.StoreByteImage(imageData,"foto1", "PNG");
finish();
}
}
};






Ernani Joppert Pontes Martins

unread,
May 27, 2013, 11:31:19 PM5/27/13
to androidb...@googlegroups.com
Via http post, vc faz um post com multipart/form-data e encapsula o arquivo como file...

[]'s

Ernani

2013/5/27 Diogo Henrique <diog...@gmail.com>

Diogo Henrique

unread,
May 28, 2013, 8:56:41 AM5/28/13
to androidb...@googlegroups.com
Então eu vou ter que fazer bem diferente de como eu faço não e ? porque hoje eu mando um Objeto. No caso eu vou ter que mandar esse Objeto e depois a imagem.. não e ? ou eu to viajando ?

Jonathans Coelho

unread,
May 28, 2013, 9:25:46 AM5/28/13
to androidb...@googlegroups.com
Você também pode transformar a imagem em um Blob e enviar normal via json.
Att.

Jonathan Coelho
Programador
Simber Tecnologia

Contato:(62) 82041097

Henrique Melo

unread,
May 28, 2013, 9:47:09 AM5/28/13
to androidb...@googlegroups.com

Não necessariamente.
Como vc vai mandar um formulário via postal,  vc pode mandar o file e outros elementos.
Logo mais eu posto como foi a minha solução.

Fred

unread,
May 28, 2013, 9:52:24 AM5/28/13
to androidb...@googlegroups.com
//troll
Manda por sedex q chega mais rápido.

Nao resisti hehe, sei que deve ter sido o corretor.


"Frederico Ferrão da Silva"

Diogo Henrique

unread,
May 28, 2013, 11:46:09 AM5/28/13
to androidb...@googlegroups.com
Por exemplo... hoje eu mando um objeto Mensagem da seguinte forma para o WS RestFul

public String inserirMensagem(Mensagem mensagem) throws Exception {
    
    Gson gson = new Gson();
    String MensagemJSON = gson.toJson(mensagem);
    String[] resposta = new WebServiceMensagem().post(URL_WS + "inserir", MensagemJSON);
    if (resposta[0].equals("200")) {
        return resposta[1];
    } else {
        throw new Exception(resposta[1]);
    }
   }


O método no WS está assim...

        @POST
@Path("/inserir")
@Produces("application/json")
@Consumes("application/json")
public String inserirMensagem(Mensagem mensagem) {
return new MensagemBusiness().inserir(mensagem);
}


A classe MensagemBusiness faz o insert na base de dados. No caso eu queria criar um novo objeto como por exemplo Pessoa....
public class Pessoa { nome,telefone,imagem } 
Com seu Business, e DAO como esse objeto Mensagem ai. Minha dúvida e como eu vou modificar o método post para pode enviar tanto as informações do objeto Pessoa (como nome,telefone,etc) como a imagem também sem modificar drasticamente a estrutura/lógica do WS... por exemplo... o post desse objeto Mensagem...

public final String[] post(String url, String json) {
    String[] result = new String[2];
    try {

        HttpPost httpPost = new HttpPost(new URI(url));
        httpPost.setHeader("Content-type", "application/json");
        StringEntity sEntity = new StringEntity(json, "UTF-8");
        httpPost.setEntity(sEntity);

        HttpResponse response;
        response = HttpClientSingleton.getHttpClientInstace().execute(httpPost);
        HttpEntity entity = response.getEntity();

        if (entity != null) {
            result[0] = String.valueOf(response.getStatusLine().getStatusCode());
            InputStream instream = entity.getContent();
            result[1] = toString(instream);
            instream.close();
            Log.d("post", "Result from post JsonPost : " + result[0] + " : " + result[1]);
        }

    // ......  e só return e tratamento de erro


@Jonathans Coelho não encontrei nada a respeito na web. Você tem algum link pra indicar ? 


Jonathans Coelho

unread,
May 28, 2013, 12:09:11 PM5/28/13
to androidb...@googlegroups.com
tenta isso

// convert from bitmap to byte array
public byte[] getBytesFromBitmap(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 70, stream);
    return stream.toByteArray();
}

// get the base 64 string
String imgString = Base64.encodeToString(getBytesFromBitmap(someImg), 
                       Base64.NO_WRAP);

Ai é só mandar a imagem como string.

Henrique Melo

unread,
May 28, 2013, 12:31:09 PM5/28/13
to androidb...@googlegroups.com
Enviar dessa forma era justamente o que queríamos evitar...
Eu envio dessa forma


public final String[] postImagem(String url, String caminhoImagem) {
String[] result = new String[2];
try {

File file = new File(caminhoImagem);
if (file.exists()) {
HttpPost httpPost = new HttpPost(new URI(URL_WS + url));

FileBody bin = new FileBody(file);

MultipartEntity reqEntity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("file", bin);
httpPost.setEntity(reqEntity);

HttpResponse response;
response = HttpClientSingleton.getHttpClientInstace().execute(
httpPost);

HttpEntity entity = response.getEntity();

if (entity != null) {
result[0] = String.valueOf(response.getStatusLine()
.getStatusCode());
InputStream instream = entity.getContent();
result[1] = toString(instream);
instream.close();
Log.d("post", "Result from post JsonPost : " + result[0]
+ " : " + result[1]);
}
}else{
result[0] = "200";
result[1] = caminhoImagem+" não encontrado.";
}
} catch (Exception e) {
Log.e("NGVL", "Falha ao acessar Web service", e);
result[0] = "0";
result[1] = "Falha de rede!";
}
return result;
}

Henrique Nogueira de Melo
Analista e Arquiteto de Software

Diogo Henrique

unread,
May 28, 2013, 2:31:36 PM5/28/13
to androidb...@googlegroups.com
Nesse caso Henrique eu teria que fazer dois envios. O primeiro método eu enviaria o meu objeto Pessoa com seus atributos e tal como no método inserirMensagem() que eu postei la em cima usando o método post() que eu postei la em cima também. O segundo método seria esse método que você postou, só que enviando apenas a imagem. a  String caminhoImagem seria o caminho da imagem no SDCARD e a  String url seria o método la no meu WS.

No meu WS esse método seria...

        @POST
        @Consumes("image/png")
        public void upload(InputStream stream) {
           
          //aqui eu salvaria a imagem em algum lugar...

        }



ou eu estou querendo d+ em fazer apenas um método que recebe o objeto Pessoa e dentro desse objeto Pessoa ter um atributo/propriedade que seja do tipo InputStream e que na hora de mandar ele como @Consumes("application/json") eu faria um pessoa.getInputStream() e armazenava ela aonde eu  quiser no servidor... viajei ? kkkkkkkkk

Jonas Alves

unread,
May 28, 2013, 3:07:06 PM5/28/13
to androidb...@googlegroups.com

Diogo,

Preste atenção: estamos tentando te dizer que o Multipart existe *justamente* para enviar várias coisas diferentes em uma requisição só, exatamente como você precisa.
A imagem não vai estar dentro do JSON, mas vai estar na mesma requisição que ele.

Leonardo Fernandez

unread,
May 28, 2013, 5:13:35 PM5/28/13
to androidb...@googlegroups.com

Aprobeitanto o topico Li alguna ves ke o android utiliza a lib apache httpclient mas na versao ke nao soporta post multipart y e necesario incluir la no libs ... alguien pode confirmar?

Send from my Android

Henrique Melo

unread,
May 28, 2013, 5:34:53 PM5/28/13
to androidb...@googlegroups.com
Tive que importar as seguintes libs:

httpmime-4.2.5.jar
httpcore-4.2.4.jar
httpclient-4.2.5.jar

Talvez não necessite de todas a seguir: 

apache-mime4j-storage-0.7.2.jar
apache-mime4j-dom-0.7.2.jar
apache-mime4j-core-0.7.2.jar
apache-mime4j-benchmark-0.7.2.jar

Ramon Pires da Silva

unread,
May 28, 2013, 6:31:54 PM5/28/13
to androidb...@googlegroups.com
O android inclui por padrão o apache httpclient , mas segundo esse post da Android Developers Blog  http://android-developers.blogspot.com.br/2011/09/androids-http-clients.html , eles recomendam utilizar o HttpUrlConnection ao invés do apache httpclient para novas aplicações , mas sintáticamente eu acho o apache httpclient mais simples de se usar.

Diogo Henrique

unread,
May 28, 2013, 10:14:06 PM5/28/13
to androidb...@googlegroups.com
@Jonas, kkkkkkk eu percebi agora lendo as minhas próprias mensagens kkkkkkkkkkk. E os aperreios da vida =D

@Henrique, eu vou testar =D muito obrigado a todos pelos toques. Eu vou postar depois aqui como eu fiz, o bom e que fica de dicas para a galera.
Reply all
Reply to author
Forward
0 new messages