0

画像を受け入れるhttpサーバーを作成しようとしています。この方法で、txtファイルまたは単純なテキストを転送することができました。ただし、jpegファイルの場合、転送されたファイルにはアクセスできなくなります。

クライアント側:

        WebRequest request = WebRequest.Create("http://localhost:8080");
        request.Method = "POST";
        byte[] byteArray = System.IO.File.ReadAllBytes(path);
        request.ContentType = "image/jpeg";
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();

サーバ側:

        HttpListenerContext context = listener.GetContext();
        HttpListenerRequest request = context.Request;
        StreamReader reader = new StreamReader(request.InputStream,request.ContentEncoding);
        Console.WriteLine("Client data content type {0}", request.ContentType);
        String Data = reader.ReadToEnd();
        byte[] imagebuffer = System.Text.Encoding.UTF8.GetBytes(Data);
        System.IO.File.WriteAllBytes(path, imagebuffer);

.txtファイルでこれを試してみると、両側のバイト配列の長さが変わらず、サーバー側のファイルが読み取り可能です。ただし、jpgの場合、配列の長さは異なります。これが問題の原因だと思います。これを回避するにはどうすればよいですか?または代替手段はありますか?

編集:「StreamReader」を「BinaryReader」に置き換え、正常に動作するようになりました。のように見えます。

        BinaryReader reader = new BinaryReader(request.InputStream, request.ContentEncoding);
        byte[] imagebuffer = reader.ReadBytes((int)request.ContentLength64);
        System.IO.File.WriteAllBytes(path, imagebuffer);
4

3 に答える 3

2

バイナリデータのHTTPPOSTは、文字列ではなくバイナリデータを転送します。サーバー側のコードがJPGをある種の文字列として誤って解析しています。Streamオブジェクトを使用し、StreamReaderオブジェクトを使用せずにストリームをバイト配列に読み込みます。

于 2013-03-05T02:47:44.267 に答える
0

UTF8でエンコードすることにより、データが破損しています。これは文字列を使用する場所ではありません。

サーバーは最初にContentLengthヘッダーを確認してから、BinaryReader.ReadBytesまたはを使用してそのバイト数を読み取る必要がありますStream.Read。ただし、状況が一致しない場合に備えて、必ず例外を探してください。

別のヒントとして、ディスクに書き込む前にすべてのデータをメモリに保存しようとするのではなく、サーバーにデータをチャンク(一度に数キロバイト)で読み取らせることをお勧めします。アップロードされるファイルの大きさはわかりません。

于 2013-03-05T03:03:23.097 に答える
-1

バイナリストリームをBase64でエンコードされた文字列に変換してから、サーバー上のバイトを取得したいと思います。

クライアント

var jpgBytes = File.ReadAllBytes(path);
var encodedString = Convert.ToBase64String(jpgBytes);
var encodedBytes = new byte[encodedString.Length * sizeof(char)];
System.Buffer.BlockCopy(encodedString.ToCharArray(), 0, bytes, 0, bytes.Length);

var requestStream = request.GetRequestStream();
requestStream.Write(encodedBytes, 0, encodedBytes.length);

サーバ

var reader = new StreamReader(request.InputStream,request.ContentEncoding); 
var base64String = reader.ReadToEnd();
var jpg = Convert.FromBase64String(base64String);
于 2013-03-05T02:47:56.263 に答える