2010-06-06 4 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#을 기능에 게시 된 파일을 업로드하려면 [] 매개 변수로 :/도움말

아, 그리고이 함수의 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] 구문을 사용할 수도 있습니다. 그렇지 않으면 페이로드에 해시 테이블 오버 헤드를 더한 int 크기에 따라 큰 오버 헤드가 발생합니다 (4x 또는 8x).

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

+0

@shin'$ _FILES [ 'Filedata']'를 변경하지 않았습니다. – Artefacto

+0

@shin 나는'file_get_contents ($ _ FILES [ 'Filedata'] [ 'tmp_name'])'을 변경하지 않았다. – Artefacto