Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Paulo Cabral

Envia imagem numa string base 64 para servidor

Mensagens Recomendadas

Paulo Cabral

Boa noite!

Estou a desenvolver uma app em ios. e pretendo que após tirar uma foto, esta envie a foto para o meu servidor,

acontece que após de ver vários toturiais vou a dar sempre ao mesmo e o servidor nao recebe a imagem! Gostaria de obter ajuda da comunidade!

Deixo aqui a função responsável pelo envio da imagem

-(void)sendImage{
   NSString *urlLogin = [NSString stringWithFormat:@"http://linkdoserver"];

   NSURL* url = [NSURL URLWithString:urlLogin];

   NSMutableURLRequest* pedido = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];


#pragma prepare image
   UIImage *foto = [uIImage imageNamed:@"imagem.jpg"];

   NSData *fotoData = UIImageJPEGRepresentation(foto, 1.0);

   NSString *stringImage = [fotoData base64Encoding];

#pragma prepare string

   NSString *postImage = [NSString stringWithFormat:@"%@=%@",@"img_full",stringImage];

   NSData *postBody = [postImage dataUsingEncoding:NSUTF8StringEncoding];

   NSString *contentType = @"application/x-www-form-urlencoded; charset=utf-8";

   [pedido addValue:contentType forHTTPHeaderField:@"Content-Length"];

   unsigned long long postLength = postBody.length;
   NSString *contentLength = [NSString stringWithFormat:@"%llu",postLength];
   [pedido addValue:contentLength forHTTPHeaderField:@"Content-Length"];



   [pedido setHTTPMethod:@"POST"];
   [pedido setHTTPBody:postBody];


   NSURLConnection* ligacao = [[NSURLConnection alloc] initWithRequest:pedido delegate:self];


   if(ligacao){

       _data = [[NSMutableData alloc] init];

       [uIApplication sharedApplication].networkActivityIndicatorVisible = YES;
   }
}

Grato pela ajuda

Editado por KTachyon
Code color

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Tem que ser mesmo com base 64? Podias optar por enviar um multipart.

Estás a adicionar o header Content-Length duas vezes em vez de colocares o Content-Type.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Assumindo que tens uma categoria para o NSData que te permite chamar a função [fotoData base64Encoding], os problemas podem ser:

NSString *contentType = @"application/x-www-form-urlencoded; charset=utf-8";

[pedido addValue:contentType forHTTPHeaderField:@"Content-Length"];

Em que o valor do segundo parâmetro devia ser @"Content-Type" e não @"Content-Length". É possível que o teu servidor esteja a tentar ler esse parâmetro, e como não o consegue interpretar, devolve erro. Até porque esse parâmetro é necessário para que o servidor determine a quantidade de informação que tem que ler até ter o conteúdo completo.

Como não tem o Content-Type, pode não saber como interpretar a informação (isto depende daquilo que está a correr no servidor).

De resto, é possível que o problema seja do lado do servidor.

Já agora, a função UIImageJPEGRepresentation(foto, 1.0) vai dar-te uma imagem maior que a que estás a ir buscar (basicamente, um JPEG sem compressão, que é o mesmo que um bitmap).

Se o objectivo é enviar a imagem sem perder qualidade, é mais fácil enviares os dados lidos directamente do ficheiro. Isto é possível de fazer mesmo para fotos e videos que estão no camera roll.

Editado por KTachyon

“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Paulo Cabral

Ja descobri o erro, no inicio da string que é gerada tenho que color a string data:image/jpeg;base64,/ o que acontece é que se enviar a string sem por a virgula a seguirao 64 o envio é relizado sem problemas se colocar a virgula dá erro.

Eu quero ir buscar a imagem e enviar numa string base64, qual é o melhor metodo para ti?

Obrigado pela ajuda!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.