Отправка байтового массива из PHP в WCF - PullRequest
3 голосов
/ 07 июня 2010

Я должен отправить байтовый массив (кодированное фото) с моего PHP-клиента на хост WCF. когда я делаю var_dump () для моего массива в PHP, я получаю массив [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 # с байтом [] в качестве параметра: / 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>

1 Ответ

1 голос
/ 07 июня 2010

Вы должны использовать строки в PHP для эмуляции байтовых массивов.Вы даже можете использовать синтаксис $str[index] со строками.В противном случае у вас ОГРОМНЫЕ издержки (4x или 8x в зависимости от размера 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 для вас.

РЕДАКТИРОВАТЬ 2: [СПЕКУЛЯЦИЯ]

Ваш 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 байтов.

...