Sud*_*ari 5 xmpp objective-c ios xmppframework
我正在使用我使用xmpp框架的聊天应用程序.我可以通过xmpp发送或接收消息.但是,当我尝试使用以下代码上传用户个人资料或头像图像时,没有获得成功.
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:stringPath]];
UIImage *tmpImage = [[UIImage alloc] initWithData:data];
UIImageView *thumbimage;
thumbimage.image = tmpImage;
NSData *imageData1 = UIImageJPEGRepresentation(thumbimage.image,0.5);
NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
NSXMLElement *photoXML = [NSXMLElement elementWithName:@"PHOTO"];
NSXMLElement *typeXML = [NSXMLElement elementWithName:@"TYPE" stringValue:@"image/jpeg"];
NSXMLElement *binvalXML = [NSXMLElement elementWithName:@"BINVAL" stringValue:[[NSString alloc] initWithData:imageData1 encoding:NSUTF8StringEncoding]];
[photoXML addChild:typeXML];
[photoXML addChild:binvalXML];
[vCardXML addChild:photoXML];
XMPPvCardTemp *myvCardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
if (myvCardTemp) {
[myvCardTemp setPhoto:imageData1];
[[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:myvCardTemp];
}
Run Code Online (Sandbox Code Playgroud)
请帮我实现上传图像概念到XMPP或纠正我如果我在代码中做错了什么.
提前致谢.
尝试将图像转换为Base64字符串值,BINVAL而不是使用UTF-8编码.
XML语法
根据文档,要求使用Base64:
The <PHOTO/> element SHOULD contain a <BINVAL/> child whose XML character data is Base64-encoded data for the avatar image.
图像限制
The image data MUST conform to the base64Binary datatype [7] and thus be encoded in accordance with Section 6.8 of RFC 2045 [8], which recommends that base64 data should have lines limited to at most 76 characters in length. However, any whitespace characters (e.g., '\r' and '\n') MUST be ignored.
您好我成功使用您的代码上传了我的头像但有一些更改:
UIImage *tmpImage = [UIImage imageNamed: @"myimage.jpg"];
NSData *imageData1 = UIImageJPEGRepresentation(tmpImage,0.0);
NSXMLElement *vCardXML = [NSXMLElement elementWithName:@"vCard" xmlns:@"vcard-temp"];
NSXMLElement *photoXML = [NSXMLElement elementWithName:@"PHOTO"];
NSXMLElement *typeXML = [NSXMLElement elementWithName:@"TYPE" stringValue:@"image/jpg"];
NSString *image64 = [self encodeToBase64String:tmpImage];
NSXMLElement *binvalXML = [NSXMLElement elementWithName:@"BINVAL" stringValue:image64];
[photoXML addChild:typeXML];
[photoXML addChild:binvalXML];
[vCardXML addChild:photoXML];
XMPPvCardTemp *myvCardTemp = [[[self appDelegate] xmppvCardTempModule] myvCardTemp];
if (myvCardTemp) {
[myvCardTemp setPhoto:imageData1];
[[[self appDelegate] xmppvCardTempModule] updateMyvCardTemp:myvCardTemp];
}
Run Code Online (Sandbox Code Playgroud)
正如Keith建议的那样,这个类转换为base64
- (NSString *)encodeToBase64String:(UIImage *)image {
return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
Run Code Online (Sandbox Code Playgroud)
此外,我修改了XMPPvCardTemp.h来公开这个方法:
- (void)setPhoto:(NSData *)data;
Run Code Online (Sandbox Code Playgroud)
无论如何,XEP-0054扩展头
#import "XMPPvCardTemp.h"
Run Code Online (Sandbox Code Playgroud)
请求.
也许这对某人有帮助.