Загрузка изображения из ios в веб-сервис дает «Недопустимая длина для массива символов Base-64»

1

Я пытаюсь загрузить изображение из приложения ios в службу веб-api.

Я кодирую изображение, используя [data base64EncodedStringWithOptions], затем объединяясь в объект с некоторыми другими данными, а затем используя NSJSONSerialization, а затем помещаю его в тело NSMutableURLRequest как "PUT", а затем используя NSURLSession, чтобы отправить его в asp.net web api service.

Данные поступают в веб-службу и десериализуются с использованием JavaScriptSerializer. Затем я использую Convert.FromBase64String для воссоздания изображения. Однако Convert.FromBase64String генерирует исключение "Недопустимая длина для массива символов Base-64". Размер изображения - 38988 байт.

Чтобы проверить это, вместо отправки изображения я посылаю массив, содержащий 'a', 'b', 'c', '', '=', 'f' (и другие символы в различных комбинациях). Это отлично работает, никакое исключение не вызывается Convert.FromBase64String.

Что может быть связано с данными изображения, вызывающими эту проблему?

Упрощенный Xcode

  NSString* const Folder = @"SomeFolder";

  NSString *fileName = [self getFileName];
  NSData *data = UIImageJPEGRepresentation(image, 0.0);
  // static char initArray[6] = {'a','b','\0',' ','e','f'};  // if i use this then it works
  // NSData* data = [[NSData alloc] initWithBytes:initArray length:6];
  NSString* sData = [data base64EncodedStringWithOptions:0];

  // set up session
  NSError *error;
  NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
  NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
  NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"<service url>/api/Documents/PutDoc/%@", id]];
  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

  NSDictionary *mapData = [[NSDictionary alloc] initWithObjectsAndKeys:Folder, @"folder", fileName, @"fileName", sData, @"sImage", nil];
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:mapData options:0 error:&error];

  NSMutableData *postData = (NSMutableData*)[@"=" dataUsingEncoding:NSUTF8StringEncoding];
  [postData appendData:jsonData];
  [request setHTTPBody:postData];
  [request setHTTPMethod:@"PUT"];
  [request addValue:@"application/x-www-form-urlencoded; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  [request addValue:@"*/*" forHTTPHeaderField:@"Accept"];

  // send request
  NSURLSessionDataTask *postDataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^{
      NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
      if ([httpResponse statusCode] == 200) {
        NSString* msg = [NSString stringWithFormat: @"Document Saved to server"];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Document Saved" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
      } else {
        NSDictionary* dic = [httpResponse allHeaderFields];
        NSString* msg = [NSString stringWithFormat: @"Server Error. Code: %d", [httpResponse statusCode]];
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Document Not Saved" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [alert show];
      }
    });
  }];

web api С# code (упрощенный)

  JavaScriptSerializer js = new JavaScriptSerializer();
  Document doc = (Document)js.Deserialize<Document>(value);
  byte[] img;
  try {
    img = Convert.FromBase64String(doc.sImage);
  } catch (Exception e) {
    // this is where the 'invalid length' exception is throw
    MyLib.LogIt(string.Format("Error converting: {0}", e.Message));
    throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) {
      Content = new StringContent("Could not convert image to binary"),
      ReasonPhrase = "Conversion Error"
    });
  }
    ..
  • 0
    Проблемы межплатформенного характера могут быть одним из виновников. попробуйте опубликовать в вашем API через фиктивное приложение и посмотреть, будет ли оно принимать закодированные данные из Windows без проблем.
  • 0
    Еще одно соображение: оригинальный base64 требует CRLF каждые 72 символа. Возможно, ваш кодировщик не добавляет их, пока ваш кодер требует их. Обычно это можно установить с помощью параметров. Проверьте параметры кодера / декодера. Примечание: ваш тест может работать, потому что он меньше 72 байт.
Показать ещё 1 комментарий
Теги:
web-services

1 ответ

0

Я отправляю выбранное изображение на сервер, используя код ниже, и он отлично работает для меня.

-(void)ImageUpdatewithImageID
{
imageData = UIImagePNGRepresentation(selectedImage);
NSString *strParameter = [NSString stringWithFormat:@"%@",[self.rmsDbController.globalDict objectForKey:@"BranchID"]];
NSString *strPar = [NSString stringWithFormat:@"http://www.example.com"];
NSURL *url = [NSURL URLWithString:[strPar stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request appendPostData:imageData];
[request setDidFinishSelector:@selector(uploadFinished:)];
[request setDidFailSelector:@selector(uploadFailed:)];
 [request setDelegate:self];
[request startAsynchronous];
}

- (void)uploadFinished:(ASIHTTPRequest *)request
{
        // after image successfully uploaded
}
- (void)uploadFailed:(ASIHTTPRequest *)request
{
        // if image not uploaded
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню