4

画像を base64 文字列に変換して、サーバー側で c#.on の HttpWebRequest を介してアップロードします このbase64文字列をバイト配列に変換するとエラーが発生します。サーバー側(Webサービス)で変更を加えたくありません。クライアント側でこの問題を解決したい.私のクライアント側のコードは次のとおりです。

//////////////////

WSManagerResult wsResult = new WSManagerResult();

        try
        {
            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(serviceURL);
            req.Method = "POST";
            req.ProtocolVersion = HttpVersion.Version11;
            req.ContentType = "application/x-www-form-urlencoded";
            //  req.ContentType = "application/x-www-form-urlencoded; charset=utf-8";
            // req.CookieContainer = new CookieContainer();


            string content = string.Empty;
            foreach (KeyValuePair<string, string> entry in paramDic)
            {

// entry.Value は、画像から評価された base 64 文字列遺伝子です

             content = content + entry.Key + "=" + entry.Value + "&&";
            }
            content = content.TrimEnd('&'); // input parameter if u have more that one //a=b&dd=aa               
            req.ContentLength = content.Length;
            // req = URLEncode(content);
            Stream wri = req.GetRequestStream();


            byte[] array = Encoding.ASCII.GetBytes(content);
            if (array.Length > 0)
                wri.Write(array, 0, array.Length);
            wri.Flush();
            wri.Close();
            WebResponse rsp = (HttpWebResponse)req.GetResponse();


            byte[] b = null;
            using (Stream stream = rsp.GetResponseStream())
            using (MemoryStream ms = new MemoryStream())
            {
                int count = 0;
                do
                {
                    byte[] buf = new byte[1024];
                    count = stream.Read(buf, 0, 1024);
                    ms.Write(buf, 0, count);
                } while (stream.CanRead && count > 0);
                b = ms.ToArray();
            }
            wsResult.result = Encoding.ASCII.GetString(b);
        }
        catch (Exception e)
        {
            clsException.ExceptionInstance.HandleException(e);
            wsResult.error = e.Message;
        }


        return wsResult;

上記の base64 文字列のすべての "+" 記号は " " 空白に変換されます。これにより、上記の問題が発生します。

この問題を解決するのを手伝ってください。

よろしく

シャー・ハリド

4

3 に答える 3

4

Rob.itは、クライアント側で「+」を16進数の「%2B」に置き換えて、以下のc#のwire.asを介してデータを投稿することで、私の問題を解決しました。

/*Using standard Base64 in URL requires encoding of '+', '/' and '=' characters into special percent-encoded hexadecimal sequences ('+' = '%2B', '/' = '%2F' and '=' = '%3D')*/ 

String stbase64datatopost =stbase64datatopost.Replace("+",@"%2B"); 
stbase64datatopost = stbase64datatopost .Replace("/",@"%2F");      
stbase64datatopost=stbase64datatopost.Replace("=",@"%3D");
于 2012-05-16T06:56:28.557 に答える
2

そのために設計されたBase64Urlエンコードと呼ばれるエンコーディングがあります。ただし、それぞれの端でエンコード/デコードを行う必要がある場合があります。

Base64 Urlでは、とに変換さ+れるため、標準のURLエンコーダーがスペースやパーセント16進数などの奇妙さを追加することなく、安全にネットワークを通過できます。-/_

于 2012-04-05T05:30:34.643 に答える
1

base64でエンコードされたデータをWebサービスに投稿してみてくださいHttpUtility.UrlEncode(entry)

Web サービスは、コードを変更せずにそれを解析できる必要があります

于 2012-04-05T06:15:06.710 に答える