【问题标题】:Sending a byte array from PHP to WCF将字节数组从 PHP 发送到 WCF
【发布时间】:2011-02-28 11:49:38
【问题描述】:

我必须从我的 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 主机上写的那样,我只得到 byte[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>

【问题讨论】:

    标签: c# php wcf soap soa


    【解决方案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);
    }
    

    所以它已经为你做了 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 个字节。

    【讨论】:

    • 您能提供一些示例代码吗?现在我的出发点是我有 $_FILES['Filedata'] 并且我尝试了许多不同的方法:/
    • @shin Pass $_FILES['Filedata'] 不变。
    • @shin 我的意思是通过 file_get_contents($_FILES['Filedata']['tmp_name']) 不变。
    • 好吧,我知道有些事情对我来说是相当黑魔法,尤其是来源;)不过你是绝对正确的 :) 答案就是做 $file = file_get_contents($_FILES['Filedata' ]['tmp_name']);然后 $par1->photo = $file;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    相关资源
    最近更新 更多