2010-06-06 100 views
3

我必须从我的PHP客户端发送一个字节数组(编码照片)到WCF主机。当我在我的PHP数组上做var_dump()时,我得到一个数组[2839],但是在服务器端,当我调试我看到接收数组只有字节[5] ...任何想法如何我可以修复它?从PHP发送一个字节数组到WCF

我用这样的代码

$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 []作为参数:/帮助

哦,这个功能的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> 

回答

1

您应该使用字符串在PHP中模拟字节数组。你甚至可以用字符串的语法$str[index]。你有一个巨大的开销(4倍或8倍取决于有效载荷的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); 
} 

所以它已经做基地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); 
} 

转换结果,其是5字节长。

+0

你能否提供一些示例代码? 现在我的出发点是我有$ _FILES ['Filedata'],我已经尝试了许多不同的方法:/ – shin 2010-06-06 22:54:04

+0

@shin通过'$ _FILES ['Filedata']'不变。 – Artefacto 2010-06-06 22:58:56

+0

@shin我的意思是传递'file_get_contents($ _ FILES ['Filedata'] ['tmp_name'])'不变。 – Artefacto 2010-06-06 23:06:47

相关问题