Содержимое массива не полностью передается из клиента php в веб-сервис .NET - PullRequest
0 голосов
/ 20 июня 2010

Я хочу передать изображение в виде байтового массива из php в веб-службу .NET. Клиент php выглядит следующим образом:

<?php
class Image{
  public $ImgIn = array();
}
$file = file_get_contents('chathura.jpg');
$ImgIn = str_split($file);
foreach ($ImgIn as $key=>$val) { $ImgIn[$key] = ord($val); }

$client = new SoapClient('http://localhost:64226/Service1.asmx?wsdl');
$result = $client->PutImage(new Image());
echo $result->PutImageResult;
//print_r($ImgIn);

?>

Вот веб-метод в веб-службе ASP.NET:

    [WebMethod]
    public string PutImage(byte[] ImgIn)
    {
        System.IO.MemoryStream ms =
           new System.IO.MemoryStream(ImgIn);
        System.Drawing.Bitmap b =
          (System.Drawing.Bitmap)Image.FromStream(ms);

        b.Save("imageTest", System.Drawing.Imaging.ImageFormat.Jpeg);
        return "test";
    }

Когда я запускаю это, содержимое изображения корректно читается в ImgIm массив в клиенте php. (В этом случае изображение содержит 16992 элемента.) Однако, когда массив передается методу веб-службы, он содержит только 5 элементов (первые 5 элементов изображения)
Могу ли я узнать, в чем причина потери данных? Как я могу избежать этого?

Спасибо

Ответы [ 2 ]

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

file_get_contents возвращает содержимое файла в виде строки, которая бесполезна для двоичных файлов, таких как изображения.Попробуйте это:

$handle = fopen("chathura.jpg", "r");
$contents = fread($handle, filesize("chathura.jpg"));
fclose($handle);
$client = new SoapClient('http://localhost:64226/Service1.asmx?wsdl');
$result = $client->PutImage($contents);
0 голосов
/ 22 июня 2010

Ребята, кажется, что пытаться передавать данные в виде байтового массива бесполезно, поскольку PHP в любом случае преобразует их в строку при отправке. Это преобразование, кажется, вводит управляющие символы в строку, заставляя отправлять только часть байтового массива. Я получил это для работы, отправив в кодировке base64 строку и декодирование внутри сервера. Код моей клиентской стороны:

<?php
class Image{
public $ImgIn = '';
}
//ini_set("memory_limit","20M");
$imageData = file_get_contents('chathura.jpg');
$encodedData = base64_encode($imageData);
$Img = new Image();
$Img->ImgIn = $encodedData;
$client = new SoapClient('http://localhost:64226/Service1.asmx?wsdl');
$result = $client->PutImage($Img);
echo($result->PutImageResult);    
?>

Код веб-службы ASP .NET:

    [WebMethod]
    public string PutImage(String ImgIn)
    {
        byte[] ImgInBytes = Convert.FromBase64String(ImgIn);
        System.IO.MemoryStream ms =
           new System.IO.MemoryStream(ImgInBytes);
        System.Drawing.Bitmap b =
          (System.Drawing.Bitmap)Image.FromStream(ms);

        b.Save("C:\\imageTest.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
        return "success";
    }
...