0

.net コア API で multipart-form/data から画像を取得しようとしていますが、この画像データの暗号化に使用されているエンコーディングがわかりません。基本的に、この文字列内で表される (画像の) バイト配列を取得する必要があります

しかし、画像はレンダリングされません。体の値を読み取るときに取得するStrying

これが、このエンコードされた文字列を取得する方法です。

 using (Stream responseStream = resposta.GetResponseStream())
 {
  var contentType = MediaTypeHeaderValue.Parse(response.ContentType);
  var boundary = HeaderUtilities.RemoveQuotes(contentType.Boundary).Value;

   for (MultipartReader smth = new(boundary, responseStream); ;)
   {
     try
     {
        MultipartSection section = await smth.ReadNextSectionAsync();

        if (section == null)
        break;

        string contentTypeFrame = section.ContentType;

        
        // Returns me the encoded string
        string bodyValue = await section.ReadAsStringAsync(); 
        if (bodyValue.ToLower().Contains("heartbeat"))
          continue;

       if (contentTypeFrame == "image/jpeg")
       {
         //Do something if it is an image
       }
    }

   catch (Exception ex) { }
  }
}

この文字列をデコードして画像バイトを取得する方法についてのアイデアはありますか?

4

1 に答える 1

0

私はそれを考え出した。

何度も試行した後、「multipart/x-mixed-replace;」からファイルを取得するための正しいコードを取得しました。ここで MultiPart セクションに分割すると、次のようになります。

using (var httpResponse = (HttpWebResponse)request.GetResponse())
                using (Stream responseStream = httpResponse.GetResponseStream())
                {
                    MediaTypeHeaderValue contentType = MediaTypeHeaderValue
                        .Parse(request.ContentType);

                    string boundary = HeaderUtilities
                        .RemoveQuotes(contentType.Boundary).Value;

                    MultipartSection section;

                    for (MultipartReader smth = new(boundary, responseStream); ;)
                    {
                        section = await smth.ReadNextSectionAsync();

                        if (section is null) break;

                        var bytes = ConverteStreamToByteArray(section.Body);
                        
                        // Save or handle the Byte array
                    }
                }

OBS:本当にコンテンツのバイトを探している場合は、いかなる状況でも readasstringasync() 関数を使用しないでください。コンテンツの本文が変更されます。(画像の場合、本文に content-type と content-length の両方が追加され、再度 jpg に変換することはできません)

Section Body Stream からデータを取得するために私が書いたこの関数だけが必要になります。

 public static byte[] ConvertStreamToByteArray(Stream stream)
        {
            stream.Position = 0; 
            // for some reason the position aways starts at the last index, So make  
            // sure to set it to 0 here

            byte[] byteArray = new byte[16 * 1024];
            using (MemoryStream mStream = new())
            {
                int bit;
                while ((bit = stream.Read(byteArray, 0, byteArray.Length)) > 0)
                {
                    mStream.Write(byteArray, 0, bit);
                }
                return mStream.ToArray();
            }
        }
于 2021-08-25T21:55:19.507 に答える