使用 UIImageJPEGRepresentation() 时无法将 NSData 转换为 NSString?
Can't convert NSData to NSString when using UIImageJPEGRepresentation()?
我正在创建多部分图像数据上传请求。
我通过 UIImageJPEGRepresentation 从 UIImage 获取 NSData
但是当我尝试将数据转换为字符串时,我得到的是零值
我已经按照这个 link 将 NSData 转换为 NSString
Convert UTF-8 encoded NSData to 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);
我检查了所有的变量都是正确的,如下
(只有变量 "str" 不应该为 nil。)
最后我得到如下正文字符串:-
正文数据=
--tqb3fjo6tld9
Content-Disposition:form-data; name="userfile[]"; filename="image0.jpeg"
Content-Type: image/*
(null)
--tqb3fjo6tld9--
您的错误是认为图像的 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]];
另一方面,您可以使用 binary
编码并直接包含原始 JPEG 数据。在这种情况下,您需要将 body
的类型更改为 NSMutableData
并使用不同的方法构建它,因为您不能将任意二进制数据附加到 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))
在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)
我正在创建多部分图像数据上传请求。 我通过 UIImageJPEGRepresentation 从 UIImage 获取 NSData 但是当我尝试将数据转换为字符串时,我得到的是零值
我已经按照这个 link 将 NSData 转换为 NSString
Convert UTF-8 encoded NSData to 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);
我检查了所有的变量都是正确的,如下
(只有变量 "str" 不应该为 nil。)
最后我得到如下正文字符串:-
正文数据=
--tqb3fjo6tld9
Content-Disposition:form-data; name="userfile[]"; filename="image0.jpeg"
Content-Type: image/*
(null)
--tqb3fjo6tld9--
您的错误是认为图像的 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]];
另一方面,您可以使用 binary
编码并直接包含原始 JPEG 数据。在这种情况下,您需要将 body
的类型更改为 NSMutableData
并使用不同的方法构建它,因为您不能将任意二进制数据附加到 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))
在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)