【问题标题】:Post image from Windows Phone Application to PHP将图像从 Windows Phone 应用程序发布到 PHP
【发布时间】:2013-03-27 13:55:20
【问题描述】:

我正在尝试为 Windows Phone 7 开发一个应用程序,该应用程序使用 PHP 将所选图片(来自图片选择器任务)上传到服务器。

我正在尝试使用 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 函数用于将其转换为流。

现在,我严重怀疑这两个函数有问题。

此外,我为每张图片都得到了完全相同的 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;
        }

【问题讨论】:

  • 如果有任何替代方法可以将图像上传到 PHP,那么它们也可以。我要做的就是上传我的图片,就是这样。
  • 请编辑您的代码以仅包含与问题相关的部分。
  • 使用 WebClient.UploadFile 可能比 httpwebrequest 更简单,因为 webclient 它是 httpwebrequest msdn.microsoft.com/en-us/library/ms144229.aspx的包装器

标签: c# windows-phone-7 encoding base64


【解决方案1】:

您的 BitmapToByte 方法过于复杂。更改 ImageToStream 以返回 MemoryStream 并且:

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

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

【讨论】:

  • 好的。我会试试这个。但是,你能帮我简化一下 ImageToStream 函数吗?
  • 我实际上对 Windows Phone 不是很熟悉,但据我所知,您的 ImageToStream 方法非常适合该平台。
  • 很抱歉这么晚才回复,实际上我的电脑崩溃了,花了这么长时间才恢复。因此,我尝试了 BitmapToByte 函数的代码,但每个文件仍然得到相同的错误输出。检查我编辑的帖子以查看我所做的更改。这是我的大学项目,我的时间不多了,所以请帮助我。
  • 不幸的是,如果不自己进行测试,我知道的还不够多,而且我没有设置 WP7 开发环境。不过我可以再问几个问题。您确定image 首先是有效图像吗?现在的输出是否与您之前发布的文本文件中的输出相同?最后,您是否应该致电MeasureArrange(如备注部分中所述here
  • @Shrayansh 关于您的 base64 字符串的另一个说明。它显然试图成为一个 jpeg 文件。将其转换为二进制文件并在十六进制编辑器中查看表明该文件开始正常,但它似乎在此过程中某处损坏。有几个有趣的模式。例如,ascii 字符串“456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz”看起来有点奇怪,文件的最后 2.5k 字节只是一遍又一遍地重复的同一个八字节序列。您所在的大学是否有人可以帮助您了解 jpeg 格式的详细信息?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-19
  • 1970-01-01
相关资源
最近更新 更多