我面临一个非常令人困惑的问题,我的Iphone应用程序使用XML-RPC将图像数据作为NSDATA格式的字符串发送到网络服务器。我还维护XML-RPC日志以保存从iPhone到Web服务器的每个请求。我的问题是当我从xml-rpc收到图像数据并将其保存到实际图像文件时,图像被损坏。我正在接收来自iphone的以下XML-RPC请求。
<?xml version="1.0"?><methodCall><methodName>ipad.dataSync</methodName>
<params><param>
<value><string><ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966
00004d4d 002a0000 00080002 01120003 00000001 00010000 >.....continued data of image>
</string></value>
</param><params>
</methodCall>
使用以下代码将图像数据保存到实际文件时,图像会损坏。
$image_name = "my_image_name.png";
$image_bits_data = "<ffd8ffe0 00104a46 49460001.....>"; //long hexadecimal formatted string of image from iphone
$fp = @fopen( $image_name, 'w+' );
if($fp)
{
if (fwrite($fp, $image_bits_data) === FALSE)
{
echo "Cannot write to file ($image_name)";
exit;
}
else
{
fclose( $fp );
clearstatcache();
echo "File is successfully uploaded.";
}
}
else
{
echo "File can not be created.Please check the path and directory
permission";
}
图像给出了适当的大小,如50KB等,但是当我打开图像时,它会被损坏,图像不会显示在图片查看器或浏览器中。如果有人得到线索或解决这个问题,请分享。感谢
答案 0 :(得分:0)
看起来你将一串空格分隔的十六进制数字保存到PNG文件中 - 这显然是不对的。至少尝试将其转换为二进制,类似
// get rid of the "<" and ">" in the begginig/end of the str so it looks like
$image_bits_data = "ffd8ffe0 00104a46 49460001....."; //long hexadecimal formatted string of image from iphone
$fp = fopen( $image_name, 'w+b');
foreach(explode(" ", $image_bits_data) as $hex){
fwrite($fp, pack('H', $hex));
}
你可能也必须摆弄字节顺序(即在pack()
中使用“h”)。但它看起来并不太有希望 - 数据开头有两个ff
字节,而AFAIK没有PNG文件以这样的标头开头。可能有一些额外的标题你必须删除...