Base64Encoded строка в IOS не декодируется должным образом на стороне сервера с помощью PHP - PullRequest
0 голосов
/ 19 июля 2011

Я конвертирую изображение в NSdata, используя UIImageJPEGRepresentation (image, 1.0), а затем кодирую его в base64, используя вспомогательный класс base64

NSString *imageOne = [self encodeBase64WithData:[imageDict objectForKey:@"ImageOne"]];

, и, наконец, отправляю его на сервер, используя метод post в качестве параметра json и на сервересторона, использующая метод php для его декодирования.

/* encode & write data (binary) */ 
$ifp = fopen($imageNameWithPath, "wb" ); 
fwrite($ifp, base64_decode($base64ImageString)); 
fclose($ifp); 

После декодирования я сохраняю файл как изображение в формате jpeg, и файл создается с правильным размером и расширением, но проблема в том, что когда я открываю его, я получаю РАЗМЕР ИЗОБРАЖЕНИЯ как 0X0 ..(проблема здесь)

Сценарий на стороне сервера корректен, так как наш разработчик для Android также отправляет base64string, а изображение сохраняется в формате jpeg с правильным размером и размером.

Эта проблема только со стороны iphoneпри отправке на сервер для декодирования.Я расшифровал изображение с помощью моего вспомогательного класса base64, и он отлично работает на моем устройстве iPhone.

UIImageView *viewImage = [[UIImageView alloc] initWithImage:[UIImage imageWithData: [self decodeBase64WithString:[registerDataDict objectForKey:@"imageOne"]]]];          
[self.view addSubview:viewImage];

Правильно ли выполняется процесс, которым я следую, на устройстве или мне нужно что-то изменить?Помощь будет оценена.

Ответы [ 2 ]

2 голосов
/ 19 июля 2011

Существуют варианты дополнительных символов, используемых для получения 65, необходимых для кодирования base64 (26 прописных + 26 строчных + 10 цифр = 62), и разные кодировщики могут использовать разные подмножества. PHP ожидает, что они будут ['+', '/', '='], ваше приложение может использовать что-то вроде ['-', '_', '='].

Как только вы выясните, что такое отображение, вы можете использовать str_replace перед декодированием в php. Для получения дополнительной информации см. страницу википедии по base64 или php документацию для base64_decode .

0 голосов
/ 19 июля 2011

Я успешно использую это с несколькими провайдерами OAuth: Base64Transcoder.c Это класс C, вы можете легко превратить его в класс Objective-C, если хотите.

Я кодирую так:

char base64Result[32];
size_t theResultLength = 32;
[Base64Transcoder base64EncodeData:digest digestLength:CC_SHA1_DIGEST_LENGTH base64Result:base64Result resultLength:&theResultLength];
NSData *theData = [NSData dataWithBytes:base64Result length:theResultLength];

NSString *base64EncodedResult = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];

Хм, хорошо, я превратил функцию C base64EncodeData исходного класса в метод Objective-C, но вы поняли идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...