【问题标题】:XMPPFramework - Upload Profile or Avatar ImageXMPPFramework - 上传个人资料或头像图片
【发布时间】:2014-08-31 23:12:22
【问题描述】:

我正在开发使用 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 的概念或纠正我。

提前致谢。

【问题讨论】:

  • 你有没有实现过文件传输功能?如果是,那么请您帮忙解决一些有关文件传输的问题。

标签: ios objective-c xmpp xmppframework


【解决方案1】:

尝试将您的图像转换为BINVALBase64 字符串值,而不是使用UTF-8 编码。

见:Convert Image to Base64 string in iOS


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.

另见:XEP-0153: vCard-Based Avatars XML Syntax

【讨论】:

  • 我会尽量按照你写的那样做
  • 嗨@Sudha,如果它对你有帮助,请接受这个答案。 :)
  • 嗨@KeithOYS 我正在使用以下 IQ 来更新 vCard。 。当我在节中使用空格字符作为昵称时,它会产生错误。我应该怎么做才能避免这种情况?
【解决方案2】:

您好,我已成功使用您的代码上传了我的头像,但有一些更改:

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];
}

这个类按照 Keith 的建议转换为 base64

- (NSString *)encodeToBase64String:(UIImage *)image {
    return [UIImagePNGRepresentation(image) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
}

此外,我修改了 XMPPvCardTemp.h 以公开此方法:

- (void)setPhoto:(NSData *)data;

无论如何,XEP-0054 扩展头

#import "XMPPvCardTemp.h"

被请求。

也许这对某人有帮助。

【讨论】:

  • 谢谢,但是通过将您的代码转换为 swift 并尝试从服务器端上传图像,它会出现如下错误,etherx.jabber.org/streams"><internal-server-error xmlns="urn:ietf: params:xml:ns:xmpp-streams"> - 你能帮我解决这个问题吗?
  • 你好 Aksar,很抱歉,很遗憾我不再关注这个项目。我帮不了你。
【解决方案3】:

您好,我使用了不同的方法,但效果很好。我做了一个界面,用户可以从图库中选择图像,我使用 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];

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2018-08-25
    • 1970-01-01
    • 2020-01-10
    • 2014-04-14
    • 2015-05-22
    • 2021-04-01
    • 2018-04-08
    • 1970-01-01
    • 2018-01-08
    相关资源
    最近更新 更多