.zip ファイルを、basicHTTPBinding (SOAP 1.1) を介してバイト配列として WCF サービスに送信しています。
基本的に、ファイルはディスクから読み取られ、テキスト エンベロープ オブジェクトでサーバーに送信されます。
.net では、次の方法でディスクからファイルを読み取りました。
...
var bytes = ReadGridLibFile(path + fileName);
....
private static byte[] ReadGridLibFile(string fileName)
{
byte[] bytes;
int numBytesToRead;
using (FileStream fsSource = new FileInfo(fileName).OpenRead())
{
// Read the source file into a byte array.
bytes = new byte[fsSource.Length];
numBytesToRead = (int)fsSource.Length;
int numBytesRead = 0;
while (numBytesToRead > 0)
{
// Read may return anything from 0 to numBytesToRead.
int n = fsSource.Read(bytes, numBytesRead, numBytesToRead);
// Break when the end of the file is reached.
if (n == 0)
break;
numBytesRead += n;
numBytesToRead -= n;
}
numBytesToRead = bytes.Length;
}
return bytes;
}
このようなバイト配列が WCF サービスに送信されると、サーバー側のディスクに書き込まれ、開くことができる .zip アーカイブになります。
同じアップロード機能のために perl クライアントを実装する必要があります。
perl では、次のようなバイトを読み取ります。
while (read(FILE, $buf, 60 * 57)) {
$bytes .= $buf;
}
close(FILE);
$bytes = encode_base64( $bytes );
$bytes をデータとしてエンベロープ オブジェクトに入れ、サーバー上で HTTP::Request 経由で手動で送信すると、バイトの配列が取得されますが、ディスクに保存すると、それは不良な (壊れた) zip アーカイブになります。perl でバイト配列を読み込んで送信する方法の問題は何ですか?