Jump to content
Sign in to follow this  
Paulo Cabral

Envia imagem numa string base 64 para servidor

Recommended Posts

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

Edited by KTachyon
Code color

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
Paulo Cabral

sim tem que ser em base 64, penso que o preblemas e que nao estou a enviar correctamente e varievel como seu valor

Share this post


Link to post
Share on other 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.

Edited by 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

Share this post


Link to post
Share on other 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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.