2014-10-01 310 views
1

我應該將文件轉換爲Base64並將該字符串添加到我附加到URL的JSON中。我遇到的文件是.zip文件和.info擴展名的文本文件。該.INFO文件正確上傳但的.zip文件我得到「不正確的填充」錯誤從服務器響應。在iOS中將文件轉換爲Base64 URL安全編碼格式

以下是我的工作;

- (void)uploadingData: (NSString *)fileName { 

    NSArray *directoryPathsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [directoryPathsArray objectAtIndex:0]; 

    NSString *absoluteFilePath = [NSString stringWithFormat:@"%@/%@/%@", documentsDirectory, baseDirName, fileName]; 

    NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:absoluteFilePath]; 
    [inputStream open]; 

    uint8_t buffer[1024]; 

    int len; 

    NSMutableString *total = [[NSMutableString alloc] init]; 

    while ([inputStream hasBytesAvailable]) { 
     len = [inputStream read:buffer maxLength:sizeof(buffer)]; 

     if (len > 0) { 
      [total appendString: [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]]; 
     } 
    } 


    NSData *plainData = [total dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *base64String = [plainData base64EncodedStringWithOptions:0]; 

// Adding to JSON and upload goes here. 
} 

我在哪裏做錯了?

此外,有沒有一種方法,我可以檢查轉換後的字符串是完全按照Base64,在它附加到JSON和上傳到服務器之前?

感謝

回答

3

我已經發現的錯誤以及答案。我不需要將.zip文件轉換爲NSInputStream,並且我沒有將URL安全方法應用於編碼字符串。以下是我解決它的方式。

- (void)uploadingData: (NSString *)fileName { 

    NSArray *directoryPathsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [directoryPathsArray objectAtIndex:0]; 

    NSString *absoluteFilePath = [NSString stringWithFormat:@"%@/%@/%@", documentsDirectory, baseDirName, fileName]; 

    NSData *zipFileData = [NSData dataWithContentsOfFile:absoluteFilePath]; 

    NSString *base64String = [zipFileData base64EncodedStringWithOptions:0]; 

    base64String = [base64String stringByReplacingOccurrencesOfString:@"/" 
                  withString:@"_"]; 

    base64String = [base64String stringByReplacingOccurrencesOfString:@"+" 
                  withString:@"-"]; 

// Adding to JSON and upload goes here. 
} 

的Android沒有辦法做到既Base64編碼和URL安全與格式單一功能。

byte[] bytes = Files.toByteArray(new File(sFileName)); 
byte[] encoded = Base64.encodeBase64URLSafe(bytes); 

我不知道是否有一種類似的iOS操作簡單方法。

0

試試這個..

+ (NSString *)base64String:(NSString *)str 
{ 
    NSData *theData = [str dataUsingEncoding: NSASCIIStringEncoding]; 
    const uint8_t* input = (const uint8_t*)[theData bytes]; 
    NSInteger length = [theData length]; 

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData* data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t* output = (uint8_t*)data.mutableBytes; 

    NSInteger i; 
    for (i=0; i < length; i += 3) { 
     NSInteger value = 0; 
     NSInteger j; 
     for (j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
       value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger theIndex = (i/3) * 4; 
     output[theIndex + 0] =     table[(value >> 18) & 0x3F]; 
     output[theIndex + 1] =     table[(value >> 12) & 0x3F]; 
     output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 
+0

不工作。服務器甚至不能識別爲文件。 – AnujAroshA 2014-10-01 08:02:11

相關問題