使用 UIImageJPEGRepresentation() 时无法将 NSData 转换为 NSString?

Paw*_*shi 0 objective-c uiimagejpegrepresentation ios

我正在创建一个多部分图像数据上传请求。我通过 UIImageJPEGRepresentation 从 UIImage 获取 NSData 但是当我尝试将数据转换为字符串时我得到 nil 值

我已按照此链接将 NSData 转换为 NSString

将 UTF-8 编码的 NSData 转换为 NSString

这是我的代码:-

    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField:@"Content-Type"];
    NSMutableString *body = [NSMutableString string];
    [body appendFormat:@"--%@\r\n", boundary];
    int i =0;
    for (UIImage *image in imagesArray) {
        NSData *data = UIImageJPEGRepresentation(image, 1.0);
        [body appendFormat:@"Content-Disposition:form-data; name=\"userfile[]\"; filename=\"image%d.jpeg\"\r\n",i];
        [body appendFormat:@"Content-Type: image/*\r\n\r\n"];
        NSString *str = [NSString stringWithUTF8String:[data bytes]]; //this variable should not be nil
        [body appendFormat:@"%@",str];
        if (error)
        {
            NSLog(@"%@", error);
        }
        i++;
    }
    [body appendFormat:@"\r\n--%@--\r\n", boundary];

    NSLog(@"bodyData = %@",body);
Run Code Online (Sandbox Code Playgroud)

我已经检查了所有变量,它们是正确的,如下

(只有变量“str”不应该为零。)

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

在此处输入图片说明

最后我得到的正文字符串如下:-

身体数据 =

--tqb3fjo6tld9
Content-Disposition:form-data; name="userfile[]"; filename="image0.jpeg"
Content-Type: image/*

(null)
--tqb3fjo6tld9--
Run Code Online (Sandbox Code Playgroud)

rob*_*off 5

你的错误是认为图像的 JPEG 表示是一个 UTF-8 编码的字符串。它不是。它是任意的二进制数据。UTF-8 字符串不是任意的字节序列;有关于哪些字节可以跟在其他字节之后的规则。

您希望将 JPEG 数据编码为适合在 HTTP 表单提交中使用的字符串。一种方法是使用 base64 编码,如下所示:

    [body appendString:@"Content-Type: image/*\r\n"];
    [body appendString:@"Content-Transfer-Encoding: base64\r\n\r\n"];
    [body appendString:[data base64EncodedStringWithOptions: NSDataBase64Encoding76CharacterLineLength]];
Run Code Online (Sandbox Code Playgroud)

另一方面,您可以使用binary编码并直接包含原始 JPEG 数据。在这种情况下,你需要改变的类型bodyNSMutableData与不同的方法建立起来,因为你不能追加任意的二进制数据的NSMutableString

更新

在 Swift 中,有一个NSMutableString

let data = UIImageJPEGRepresentation(image, 0.5)!
let body = NSMutableString()
body.append("Content-Type: image/*\r\n")
body.append("Content-Transfer-Encoding: base64\r\n\r\n")
body.append(data.base64EncodedString(options: .lineLength76Characters))
Run Code Online (Sandbox Code Playgroud)

在 Swift 中,有一个String

let data = UIImageJPEGRepresentation(image, 0.5)!
var body = ""
body += "Content-Type: image/*\r\n"
body += "Content-Transfer-Encoding: base64\r\n\r\n"
body += data.base64EncodedString(options: .lineLength76Characters)
Run Code Online (Sandbox Code Playgroud)