【问题标题】:NSData appendData: UIImageJPEGRepresentation() returns nilNSData appendData:UIImageJPEGRepresentation() 返回 nil
【发布时间】:2015-05-18 14:09:23
【问题描述】:

这让我抓挠了很长时间。

我正在准备UIImage 作为HTTP request 的一部分发布。我正在使用以下代码执行此操作:

[postData appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
                        [postData appendData:[[NSString stringWithFormat:@"Content-Disposition: attachment; name=\"q%@\"; filename=\".jpg\"\r\n" , key] dataUsingEncoding:NSUTF8StringEncoding]];
                        [postData appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
                        [postData appendData:[NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]];
                        [postData appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

我遇到的问题是postData 在运行这些行之后是null

使用NSLog 我发现[postData appendData:[NSData dataWithData:UIImageJPEGRepresentation(image, 1.0)]]; 是导致这种情况发生的行。然后我继续查看图像是否有问题。 UIImageJPEGRepresentation(image, 1.0) 将大量数据输出到控制台,并将图像添加到 UIImageView 会显示我期待的 .jpg。

我完全被迷住了。请帮忙>.

编辑

在下面的一些崩溃之后,我意识到它肯定是在发布图像 .

NSLog(@"postData = %@",[postData length]);

显示 280861(字节?),但带有 <?php print_r($_FILES); ?> 的 PHP 文件返回数组 {}

【问题讨论】:

  • 如何创建postData 实例?
  • NSString jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; NSStringpost = [NSString stringWithFormat:@"&json=%@", jsonString]; NSMutableData *postData = [NSMutableData dataWithData:[post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:NO]]; UIImage *image = xxxxx
  • 刚刚注意到那是 ASCII 和其余的 UTF8。我改变了这个并没有改善
  • 只是为了实验:改用 UIImagePNGRepresentation。
  • 我已经试过了,同样的结果:(

标签: iphone ios objective-c nsdata


【解决方案1】:
  1. UIImageJPEGRepresentation(image, 1.0) 返回一个无法转换为 NSString 的 NSData 对象。 jpeg 不包含有效字符。并且任意数据不能转换为有效字符串。

  2. 即使UIImageJPEGRepresentation(image, 1.0) 返回 nil,[NSData dataWithData:] 调用也会确保附加到 postData 的数据不是 nil。 [NSData dataWithData:nil]; 返回一个空的 NSData 实例,而不是 nil。

  3. 关于您的回答。 nil 不是有效的字符串编码。编译器应该显示一个警告,并且您应该在控制台中看到一个警告“检测到不正确的 NSStringEncoding 值 0x0000。假设为 NSASCIIStringEncoding。将在不久的将来停止这种兼容性映射行为。”。

您不能将postData 转换回 NSString。如果你想检查图像是否是 NSData 对象的一部分,你可以查看 postData 的长度。

【讨论】:

  • 好的,感谢您的澄清。我仍然有这个脚本的问题。我有一个 PHP 脚本,它简单地执行 <?php print_r($_FILES) ?>,它返回一个空数组。这意味着数据仍未正确发布。我将在 OP 中发布我的完整代码
【解决方案2】:

解决方法:

[postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\";\r\nfilename=\"%@.jpeg\"\r\nContent-Type: image/jpeg\r\n\r\n", key,key] dataUsingEncoding:NSUTF8StringEncoding]];
[postData appendData:[NSData dataWithData:imageData]];
[postData appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

我已经包含的数据之后的第一个换行符似乎已经解决了这个问题

【讨论】:

    【解决方案3】:

    你怎么知道postData 是空的?请注意,您无法使用以下某些类别/扩展名将其转换为 UTF8 字符串。

    extension NSData { func to_string(encoding:UInt = NSUTF8StringEncoding) -> String? { return NSString(data:self, encoding:encoding) as? String } }

    【讨论】:

      猜你喜欢
      • 2015-12-10
      • 2016-10-19
      • 2016-01-12
      • 1970-01-01
      • 2015-08-31
      • 2016-09-04
      • 2019-01-24
      • 2016-02-15
      相关资源
      最近更新 更多