3

PHP を使用して、選択した画像 (画像選択タスクから) をサーバーにアップロードする Windows Phone 7 用のアプリケーションを開発しようとしています。

これを行うために HttpWebRequest を使用しようとしています。そして、データも正常に投稿されます。私が直面している問題は、投稿する前に画像を base64 にエンコードする必要があることです。そして、私はそれを正しくエンコードすることができません。

これはこれまでの私のC#コードです:

public partial class SamplePage : PhoneApplicationPage
    {
        public SamplePage()
        {
            InitializeComponent();
        }

        PhotoChooserTask selectphoto = null;

        private void SampleBtn_Click(object sender, RoutedEventArgs e)
        {
            selectphoto = new PhotoChooserTask();
            selectphoto.Completed += new EventHandler<PhotoResult>(selectphoto_Completed);
            selectphoto.Show();
        }

        void selectphoto_Completed(object sender, PhotoResult e)
        {
            if (e.TaskResult == TaskResult.OK)
            {
                BinaryReader reader = new BinaryReader(e.ChosenPhoto);
                image1.Source = new BitmapImage(new Uri(e.OriginalFileName));
                txtBX.Text = e.OriginalFileName;

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://"+QR_Reader.MainPage.txtBlck+"/beamer/saveimage.php");
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";

                string str = BitmapToByte(image1);
                MessageBox.Show(str);

                string postData = String.Format("image={0}", str);   

                // Getting the request stream.
                request.BeginGetRequestStream
                (result =>
                {
                    // Sending the request.
                    using (var requestStream = request.EndGetRequestStream(result))
                    {
                        using (StreamWriter writer = new StreamWriter(requestStream))
                        {
                            writer.Write(postData);
                            writer.Flush();
                        }
                    }

                    // Getting the response.
                    request.BeginGetResponse(responseResult =>
                    {
                        var webResponse = request.EndGetResponse(responseResult);
                        using (var responseStream = webResponse.GetResponseStream())
                        {
                            using (var streamReader = new StreamReader(responseStream))
                            {
                                string srresult = streamReader.ReadToEnd();
                            }
                        }
                    }, null);
                }, null);

            }  // end of taskresult == OK           
        }  // end of select photo completed

        private Stream ImageToStream(Image image1)
        {
            WriteableBitmap wb = new WriteableBitmap(400, 400);

            wb.Render(image1, new TranslateTransform { X = 400, Y = 400 });

            wb.Invalidate();
            Stream myStream = new MemoryStream();

            wb.SaveJpeg(myStream, 400, 400, 0, 70);

            return myStream;
        }
        private string BitmapToByte(Image image) //I suspect there is something wrong here
        {
            Stream photoStream = ImageToStream(image);
            BitmapImage bimg = new BitmapImage();
            bimg.SetSource(photoStream); //photoStream is a stream containing data for a photo

            byte[] bytearray = null;
            using (MemoryStream ms = new MemoryStream())
            {
                 WriteableBitmap wbitmp = new WriteableBitmap(bimg);
                 wbitmp.SaveJpeg(ms, wbitmp.PixelWidth, wbitmp.PixelHeight, 0, 100);
                 bytearray = ms.ToArray();
            }
            string str = Convert.ToBase64String(bytearray);
            return str;
        }
    }

BitmapToByte 関数は、画像を base64 文字列に変換するために使用されます。そして、ImageToStream 関数を使用してストリームに変換します。

さて、私はこれら 2 つの機能に何か問題があるのではないかと真剣に疑っています。

さらに、すべての画像でまったく同じ base64 文字列を取得しています。はい、選択している画像に関係なく、まったく同じ base64 文字列を取得しています。これは非常に奇妙です。これの何が悪いのかわかりません。

ここにテキスト ファイルをアップロードしました: http://textuploader.com/?p=6&id=vWZy これには base64 文字列が含まれています。

サーバー側では、PHP は postdata を正常に受け入れており、デコードも完全に機能しています (これを確認するために、いくつかの base64 文字列を手動でデコードしました)。私が直面している唯一の問題は、base64 エンコーディングです。

私を助けてください。

編集 ImageToStream および BitmapToByte 関数に次の変更を加えました。

private MemoryStream ImageToStream(Image image1)
        {
            WriteableBitmap wb = new WriteableBitmap(400, 400);

            wb.Render(image1, new TranslateTransform { X = 400, Y = 400 });

            wb.Invalidate();
            MemoryStream myStream = new MemoryStream();

            wb.SaveJpeg(myStream, 400, 400, 0, 70);

            return myStream;
        }

        private string BitmapToByte(Image image)
        {
            MemoryStream photoStream = ImageToStream(image);

            byte[] bytearray = photoStream.ToArray();
            string str = Convert.ToBase64String(bytearray);
            return str;
        }
4

1 に答える 1

1

BitmapToByte メソッドは非常に複雑です。andImageToStreamを返すように変更します。MemoryStream

private string BitmapToByte(Image image)
{
    MemoryStream photoStream = ImageToStream(image);

    byte[] bytearray = photoStream.ToArray();
    string str = Convert.ToBase64String(bytearray);
    return str;
}
于 2013-03-22T02:15:48.553 に答える