2010-06-06 26 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