错误 - 将图像发送到服务器后"Corrupt JPEG data: 214 extraneous bytes before marker"



我通过将图像转换为base64格式来将图像发送到服务器。但问题是在发送图像字符串后,字符"+"将被空格"替换。显示错误:

Corrupt JPEG data: 214 extraneous bytes before marker

如何解决这个问题?提前感谢您的帮助。

以下是将图像转换为base64格式的代码:

-(NSString*)base64forData:(NSData*)theData {
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];
}

以下是转换为Json格式的代码&将其发送到服务器:

-(void)setOflynData2JsonFormat{
if (!([self.getOfflineData count] == 0)) {
    NSArray *array = [self getOfflineData];
    arrayOfJsonString = [[NSMutableArray alloc]init];
    for (int i = 0; i<[array count]; i++) {
        uniqueId++;
        NSNumber *uId = [NSNumber numberWithInt:uniqueId];
        OfflineTableObject *offObj = [array objectAtIndex:i];
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
        [dict setValue:uId forKey:@"id"];
        [dict setValue:offObj.qrCode forKey:@"qrCode"];
        [dict setValue:offObj.offlineStatus forKey:@"activity"];
        [dict setValue:offObj.time forKey:@"time"];
        [dict setValue:offObj.imageData forKey:@"image_base64"];

        [arrayOfJsonString addObject:dict];
    }
    NSData * jsonDataFromArray = [NSJSONSerialization dataWithJSONObject:arrayOfJsonString
                                                        options:kNilOptions
                                                          error:nil];

    NSString *string = [[NSString alloc] initWithData:jsonDataFromArray encoding:NSUTF8StringEncoding];
    //replace backslash from string
    NSString *jsonString = [[NSString alloc] init];
    NSString *specialChar = @"\";
    jsonString = [string stringByReplacingOccurrencesOfString:specialChar withString:@""];
    NSLog(@"sent string to server: %@",jsonString);
    int lng = [jsonString length];
    NSLog(@"2nd string length: %d",lng);

    Get_Object_Class *obj = [[Get_Object_Class alloc]init];
    NSString *dvid = [[UIDevice currentDevice] uniqueIdentifier];
    [obj sendDeviceId:dvid];
    NSLog(@"device id: %@",dvid);

    int check = [obj sendOfflynData2Server:jsonString];
    if (check == 1) {
        NSLog(@"Offline data uploaded");
        AppDelegate *test = [AppDelegate sharedInstance];
        [test resetOfflineTable];
    }
    else{
        NSLog(@"Offline data upload failed");
    }
}
else{
    NSLog(@"Offline table is empty");
}
}
-(BOOL)sendOfflynData2Server:(NSString *)jsonRequest{
NSHTTPURLResponse * response = nil;
NSError* error = nil;
NSString * post = [NSString stringWithFormat:@"&offline_data=%@",jsonRequest];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL: [NSURL URLWithString:[NSString stringWithFormat: @"%@saveofflinedata.php", APIheader]]];

[request setHTTPMethod:@"POST"];
[request setValue:jsonRequest forHTTPHeaderField:@"offline_data"];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSData *dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *stringReply = (NSString *)[[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding];
stringReply = [stringReply stringByReplacingOccurrencesOfString:@"(" withString:@"["];
stringReply = [stringReply stringByReplacingOccurrencesOfString:@")" withString:@"]"];
stringReply = [stringReply stringByReplacingOccurrencesOfString:@";" withString:@""];
NSLog(@"stringReply: %@", stringReply);
SBJsonParser *parser = [[SBJsonParser alloc]init];
NSArray *array = [parser objectWithString:stringReply error:nil];
stringReply = [NSString stringWithFormat:@"%@",[[array objectAtIndex:0]objectForKey:@"success"]];

NSLog(@"Success: %@", stringReply);
return [stringReply intValue];

}

这是我发送到服务器的字符串:

        NSString * str1 = @"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";

这是服务器中显示的字符串:

    NSString *str2 = @"/9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQAAAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAZKADAAQAAAABAAAAggAAAAD/2wBDACAWGBwYFCAcGhwkIiAmMFA0MCwsMGJGSjpQdGZ6eHJmcG6AkLicgIiuim5woNqirr7EztDOfJri8uDI8LjKzsb/2wBDASIkJDAqMF40NF7GhHCExsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsb/wAARCACCAGQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4 Tl5ufo6erx8vP09fb3 Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3 Pn6/9oADAMBAAIRAxEAPwDeprtgdQPc1FdXUdrCZJD9B3JrnZ76S4lLO5C9lB4oEb3nLu4kzTvP2981zq3gTpxT/tp65pDN2e4VogO5NQBFchiASOmaz1ud5Xmr8ByvFAF 3IEQ UL9BUmagGUHrjpSqxIyaAJDSUmaTNADqSkzRmgBc0UlFAHOavdi4uiAconA96zi9ErZNNAyaAAtQGNTRw7u1SG1z0FA7EUU21hntWhZ3uHAJqg9uVFRAlTQI6uC7SRtpPNWhXJw3DKwcHkV0djcrcQgg80AWDSU402gABpc0YpMUALmikxRQBxZ5NSJgdqcsW1RnqalVUB56UDFS4VTjFXoJI5BzgVmTbCflqe1gdzxkCkNFyaOMr1rMnjweKnuQ0ZxnpVfexHIzQgZCCRxWnpEzLPtB4NZr9at6UcXqe9Mk6nPFApKXNMQZpM0UUgDNFJRQMwjaM3JNMOnFsDNXmfHFPVxtqTSxQFikf3j09at21xBHwPzqjfNJI21c4qBEkjQ8ZNArly9VZcslUo2Vcq3WprN2LbX71PcWIc7l60LQGrmfMgIyKk0oZv4xnvTngZEOfSm6QpOoR47VSJZ1NJRSZpki0ZpM0UgDNFJRQMx3f5qQ3IHAqGV8cDrUawljuc4FSi7kpuF3Zxk08XCMOcVGGjXgClKxsOOtMRLCqB94q6GBWsobkPHSrUUhIxUspMkmAZTVTRoz/aDnsoNWHbil0Vfmnf1OKcSZGtSUUlWQLRmkpKQC0UlFAzCdfmzSMTipWwab8o61JZAUY0qKRU4ZTS/LSuFhgNKhxSbeaUCkMczZHvWjYW/2eAA/ePJqhCu6ZR71r1cSJC0lFFMkKSijNABRSZooAwS KYXJNPaCU87DUflSD A/lUljg9OD81H5b/3T VGCD0NAXJw3FOXmolRm6KT FTLHJ/cNKw7liyXNwD6DNaNQ6fbMELMMFqtPEw6VaIZHRThE57U7yX9KBEdJU4tz3NL9m/2qBleipjbt7UUASeQnpTDaoewqeloAqm0T0FN wx56CrlFMCBLWNewp4hQdqkooEAAHSiiigYUtFFABRRRQAUUUUANNHaiigQCloopAFFFFMYUUUUALRRRQAUUUUAFFFFAH//2Q==";

您的+符号在发布数据中不是URL编码的,即使您的内容类型表明它们是URL编码的。

您需要将它们替换为%2B,收件人才能正确获取它们。

为什么不将UIImage转换为NSData,将NSData转换为base64?

NSData *imageData = UIImageJPEGRepresentation(image, 1.0);
NSString *base64string = [imageData base64EncodedString];

只需实现许多NSData类别中的一个,如以下类别:https://github.com/l4u/NSData-Base64

最新更新