2013-03-22 58 views
3

我正在嘗試開發一個Windows Phone 7應用程序,該應用程序使用PHP將所選圖片(從圖片選擇器任務)上載到服務器。從Windows Phone應用程序到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; 
     } 
+0

如果有一個圖像上傳到PHP任何其他方法,那麼他們也沒關係。 所有,我想要做的是** **上傳**我的形象,就是這樣。 – 2013-03-22 02:03:16

+0

請修改您的代碼以僅包含與問題相關的部分。 – 2013-03-22 02:08:55

+0

使用WebClient.UploadFile也許它比httpwebrequest更簡單,因爲webclient它是httpwebrequest的包裝http://msdn.microsoft.com/en-us/library/ms144229.aspx – jjchiw 2013-03-22 02:12:55

回答

1

您BitmapToByte方法是極其過於複雜。更改ImageToStream返回一個MemoryStream和:

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

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

好吧。我會試試這個。但是,你能幫我簡化ImageToStream功能嗎? – 2013-03-23 04:02:20

+0

我對Windows Phone並不十分熟悉,但從我所知道的方面來說,您的'ImageToStream'方法對於該平臺來說相當不錯。 – 2013-03-23 06:16:41

+0

非常感謝。我希望它能正常工作。 – 2013-03-23 07:31:35

相關問題