[英]Converting file to Base64 URL safe encoding format in iOS
我應該將文件轉換為Base64並將該String添加到我附加到URL的JSON。 我所擁有的文件是.zip文件和擴展名為.info的文本文件。 .info文件正確上傳但是使用.zip文件我收到“ 錯誤填充 ”錯誤作為來自服務器的響應。
以下是我的工作;
- (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並上傳到服務器?
謝謝
我發現了錯誤和答案。 我不需要將.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。
嘗試這個..
+ (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[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.