我正在使用我使用过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];
}
请帮我实现上传图片概念到XMPP或纠正我如果我在代码中做错了什么。
提前致谢。
答案 0 :(得分:6)
尝试将图片转换为Base64
的{{1}}字符串值,而不是使用BINVAL
编码。
请参阅:Convert Image to Base64 string in iOS
XML语法
根据文档,要求使用UTF-8
:
Base64
图片限制
The <PHOTO/> element SHOULD contain a <BINVAL/> child whose XML character data is Base64-encoded data for the avatar image.
答案 1 :(得分:6)
您好我成功使用您的代码上传了我的头像但有一些更改:
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];
}
此类转换为base64,如Keith建议的那样
- (NSString *)encodeToBase64String:(UIImage *)image {
return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}
此外,我修改了XMPPvCardTemp.h以公开此方法:
- (void)setPhoto:(NSData *)data;
无论如何,XEP-0054扩展标题
#import "XMPPvCardTemp.h"
请求。
也许这对某人有帮助。
答案 2 :(得分:0)
您好我使用了不同的方式,但效果非常好。我创建了一个界面,用户可以从图库中选择图像,我使用ImagePicker执行此操作,然后从用户JID更改图像的名称,然后您必须将图像上传到服务器...我使用FTP但你可以使用不同的方式,如HTTPS或类似的东西......此时,您在服务器中的图像与用户的JID ...现在将SDWebImage添加到您的项目
NSString *photourl=@"http://your image host/";
//adding 2 strings for example http://your image host/guy1@myserver.com
NSString *fullUrl = [photourl stringByAppendingString:fjid];
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 54, 54)];
[imageView setImageWithURL:[NSURL URLWithString:fullUrl]
placeholderImage:[UIImage imageNamed:@"use an image while the image is loaded"]];
[self.view addSubview:imageView];
imageView.layer.cornerRadius = 25.0;
imageView.layer.masksToBounds = YES;
imageView.frame = CGRectMake(152, 2, 54, 54); //set the proper frame here
[self.titleButton addSubview:imageView];
希望这能帮到你