我必须从我的PHP客户端向WCF主机发送一个字节数组(编码的照片)。当我在PHP中对我的数组执行var_dump()时,我得到一个数组[2839],这是好的但是在服务器端调试时我看到接收到的数组只是字节[5] ...我知道如何修复它?
我使用了这样的代码
$file = file_get_contents($_FILES['Filedata']['tmp_name']);
$byteArr = str_split($file);
foreach ($byteArr as $key=>$val) { $byteArr[$key] = ord($val); }
$client = new SoapClient('http://localhost:8000/MgrService?wsdl',
array(
'location' => 'http://localhost:8000/MgrService/SOAP11',
'trace' => true,
'soap_version' => SOAP_1_1
));
$par1->profileId = 13;
$par1->photo = $byteArr;
$client->TestByte($par1);
正如我之前在wcf主机上写的那样,我只得到字节[5]:/也许它需要一些解码来对肥皂序列化?我应该使用Base64解码吗?
一般我只想将发布的文件上传到c#函数,并将byte []作为参数:/ Help
哦,这个函数的wsdl部分看起来像这个
<xs:element name="TestByte">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="photo" nillable="true" type="xs:base64Binary"/>
</xs:sequence>
</xs:complexType>
</xs:element>
答案 0 :(得分:1)
您应该在PHP中使用字符串来模拟字节数组。您甚至可以将语法$str[index]
与字符串一起使用。你有一个巨大的开销(4x或8x,具体取决于有效负载PLUS哈希表开销的int大小)否则。
我不太熟悉SOAP扩展所做的类型转换,但是使用字符串可能会有效。
编辑:刚检查了消息来源:
if (Z_TYPE_P(data) == IS_STRING) {
str = php_base64_encode((unsigned char*)Z_STRVAL_P(data), Z_STRLEN_P(data), &str_len);
text = xmlNewTextLen(str, str_len);
xmlAddChild(ret, text);
efree(str);
}
所以它已经为你做了base 64编码。
EDIT2:[推测]
您的5字节长结果是因为转换为遵循上述代码的字符串:
if (Z_TYPE_P(data) == IS_STRING) {
...
} else {
zval tmp = *data;
zval_copy_ctor(&tmp);
convert_to_string(&tmp);
str = php_base64_encode((unsigned char*)Z_STRVAL(tmp), Z_STRLEN(tmp), &str_len);
text = xmlNewTextLen(str, str_len);
xmlAddChild(ret, text);
efree(str);
zval_dtor(&tmp);
}
转换结果为“Array”,长度为5个字节。