上传图像时显示System.NotSupportedException

时间:2011-10-19 05:40:06

标签: c# windows-phone-7.1 windows-phone-7

在我的应用程序中,用户可以从手机上传照片并将其发布到网站。应用程序运行良好,直到我将手机操作系统更新到Windows 7.1.更新到Windows 7.1后,我得到一个异常“System.NotSupportedException”on上传图片。这个问题是因为手机升级了?还是问题出现在我的图片上传课程中?但是这个代码运行良好,直到我更新我的手机操作系统。(我没有更新我的项目到7.1只有手机操作系统和模拟器更新为芒果)   这是我的代码,

private void ApplicationBarPhotoChooser_Click(object sender, EventArgs e)
    {

            objPhotoChooserTask.Show();

    }
      void objPhotoChooserTask_Completed(object sender, PhotoResult e)
    {
        if (e.TaskResult == TaskResult.OK)
        {
            BitmapImage objBitmapImage = new BitmapImage();
            objBitmapImage.SetSource(e.ChosenPhoto);
            upLoadPhoto(objBitmapImage);

        }
    }
     private void upLoadPhoto(BitmapImage PhotoToUpload)
    {
        if ((Application.Current as App).objTwitterPostMessageContainer == null)
        {
            (Application.Current as App).objTwitterPostMessageContainer = new TwitterPostMessageContainer();
        }
        (Application.Current as App).objTwitterPostMessageContainer.properties = "";
        ImageUploader objImageUploader = new ImageUploader();
        objImageUploader.ms_caption = strAPIKEY;
        objImageUploader.PhotoToPost = PhotoToUpload;
        objImageUploader.PostPhoto();
        timer.Start();
        btnNext.IsEnabled = false;

    }

图像上传类

public class ImageUploader
{

    #region class setup



    //local property variables

    private string ms_boundary = string.Empty;

    private string ms_accesstoken = string.Empty;

    private BitmapImage mimg_phototopost;

    public string ms_caption { get; set; }



    // some multipart constants we will use in the strings we create

    private const string Prefix = "--";

    private const string NewLine = "\r\n";



    public ImageUploader() { }





    public BitmapImage PhotoToPost
    {

        get { return mimg_phototopost; }

        set { mimg_phototopost = value; }

    }





    public string PhotoCaption
    {

        get { return ms_caption; }

        set { ms_caption = value; }

    }



    public String BoundaryString
    {

        get
        {

            if (ms_boundary == string.Empty)

            { ResetBoundaryString(); }

            return ms_boundary;

        }

    }



    public void ResetBoundaryString()
    {

        ms_boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x");

    }



    public String AccessToken
    {

        get

        { return ms_accesstoken; }

        set

        { ms_accesstoken = value; }

    }



    #endregion



    #region Post Data Stuff





    public void PostPhoto()

    //builds a byte array with the image in it and passes it to PostPhotoHTTPWebRequest

    //which sends the data via a POST to facebook
    {

        if (mimg_phototopost != null)
        {
            // PostPhotoHTTPWebRequest(BuildPostData());
            byte[] ba_photo = ImageToByteArray(PhotoToPost);
            PostPhotoHTTPWebRequest(ba_photo);
        }
    }



    private byte[] BuildPostData()

    //Uses the PhotoToPost and BoundaryString to build a byte array we can use as the data in the POST message
    {

        // Build up the post message header

        var sb = new StringBuilder();



        //accepts a message parameter which will be the caption to go with the photo



        sb.Append(Prefix).Append(BoundaryString).Append(NewLine);

        //sb.Append("Content-Disposition: form-data; name=\"message\"");

        sb.Append("Content-Disposition: form-data; name=\"apikey\"");

        sb.Append(NewLine);

        sb.Append(NewLine);

        sb.Append(PhotoCaption);

        sb.Append(NewLine);



        //data for the image

        string filename = @"file.jpg";

        string contenttype = @"image/jpeg";



        sb.Append(Prefix).Append(BoundaryString).Append(NewLine);

        sb.Append("Content-Disposition: form-data; filename=\"").Append(filename).Append("\"").Append(NewLine);

        sb.Append("Content-Type: ").Append(contenttype).Append(NewLine).Append(NewLine);



        byte[] ba_Header = Encoding.UTF8.GetBytes(sb.ToString());

        byte[] ba_photo = ImageToByteArray(PhotoToPost);

        byte[] ba_footer = Encoding.UTF8.GetBytes(String.Concat(NewLine, Prefix, BoundaryString, Prefix, NewLine));



        // Combine all the byte arrays into one - this is the data we will post

        byte[] postData = new byte[ba_Header.Length + ba_photo.Length + ba_footer.Length];

        Buffer.BlockCopy(ba_Header, 0, postData, 0, ba_Header.Length);

        Buffer.BlockCopy(ba_photo, 0, postData, ba_Header.Length, ba_photo.Length);

        Buffer.BlockCopy(ba_footer, 0, postData, ba_Header.Length + ba_photo.Length, ba_footer.Length);



        //Set the lastposteddata variable to we can show it

        ms_lastposteddata = ByteArrayToString(postData);



        //return the data as a byte array

        return postData;

    }



    private string ByteArrayToString(byte[] bytes)
    {

        //Converts the raw post data so you can display it for testing, etc...

        System.Text.Encoding enc = System.Text.Encoding.UTF8;

        string PostString = enc.GetString(bytes, 0, bytes.Length);

        return PostString;

    }



    private string ms_lastposteddata = "No Data Posted Yet";

    public string LastPostedData
    {

        get { return ms_lastposteddata; }

    }

    #endregion







    #region HTTPWebRequest

    //Posts the data to Facebook - can only post to me/photos (no access to users wall)



    public void PostPhotoHTTPWebRequest(byte[] postData)
    {

        try
        {

            //Fire up an HttpWebRequest and pass in the facebook url for posting as well as the AccessToken

            //The AccessToken has to be in the URL - it didn't work just passing it as part of the POST data
            Encoding objEnc = Encoding.UTF8;
            string boundary = @"0xKhTmLbOuNdArY";
            HttpWebRequest request = HttpWebRequest.Create("http://app.myweb.com/api/v1/poster/post/photo/file") as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = string.Format("multipart/form-data;charset=utf-8; boundary={0}", boundary);
            StringBuilder sb = new StringBuilder();
            sb.AppendFormat("--{0}\r\n", boundary);
            sb.AppendFormat("Content-Disposition: form-data; name=\"apikey\"\r\n\r\n");
            sb.AppendLine(ms_caption);
            sb.AppendFormat("--{0}\r\n", boundary);
            sb.AppendFormat("Content-Disposition: form-data; name=\"photoFile\"; filename=\"" + "file.jpg" + "\"" + "\r\n");
            sb.AppendFormat("Content-Type:image/jpeg\r\n\r\n");
            byte[] req_before_img = objEnc.GetBytes(sb.ToString());
            byte[] req_img = postData;
            String strFooter = String.Format("--{0}--", boundary);
            byte[] req_after_img = objEnc.GetBytes(strFooter);

            byte[] data_to_send = new byte[req_before_img.Length + req_img.Length + req_after_img.Length];

            // byte[] data_to_send;
            Buffer.BlockCopy(req_before_img, 0, data_to_send, 0, req_before_img.Length);
            Buffer.BlockCopy(req_img, 0, data_to_send, req_before_img.Length, req_img.Length);
            Buffer.BlockCopy(req_after_img, 0, data_to_send, req_before_img.Length + req_img.Length, req_after_img.Length);
            request.BeginGetRequestStream((ar) => { GetRequestStreamCallback(ar, data_to_send); }, request);

            /******************************************************************************************************/

            /******************************************************************************************************/
        }

        catch (Exception ex)
        {

            MessageBox.Show(ex.ToString());

        }

    }



    private void GetRequestStreamCallback(IAsyncResult asynchronousResult, byte[] postData)
    {

        try
        {

            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;



            // End the operation

            Stream postStream = request.EndGetRequestStream(asynchronousResult);



            // Write to the request stream.

            postStream.Write(postData, 0, postData.Length);

            postStream.Close();



            // Start the asynchronous operation to get the response

            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);



        }

        catch (Exception ex)
        {

            Deployment.Current.Dispatcher.BeginInvoke(() => { UpdatePostStatus("Error Uploading [GetRequestStreamCallback]:", ex.ToString()); });

        }

    }



    private void GetResponseCallback(IAsyncResult asynchronousResult)//i get the exception notSupportedException
    {

        try
        {

            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;



            // End the operation

            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult);

            Stream streamResponse = response.GetResponseStream();

            StreamReader streamRead = new StreamReader(streamResponse);

            string responseString = streamRead.ReadToEnd();


            //$$$$$$$$$$
            Dictionary<string, string> Items = new Dictionary<string, string>();
            Items = JsonConvert.DeserializeObject<Dictionary<string, string>>(responseString);
            bool bFlag = false;
            foreach (KeyValuePair<string, string> kvp in Items)
            {
                String strKey = kvp.Key;
                if (strKey == "photoUrl")
                {
                    responseString = kvp.Value;
                    bFlag = true;
                }

            }

            if (!bFlag)
            {
                (Application.Current as App).objTwitterPostMessageContainer.properties = "error";
            }

            else
            {
                (Application.Current as App).objTwitterPostMessageContainer.properties = "{\"imageToUpload\":" + "\"" + responseString + "\"}";
            }
            //$$$$$$$$$$
            System.Diagnostics.Debug.WriteLine(responseString);

            //Update the UI



            Deployment.Current.Dispatcher.BeginInvoke(() => { UpdatePostStatus("Upload Success! Picture ID:", responseString); });



            // Close the stream object

            streamResponse.Close();

            streamRead.Close();

            // Release the HttpWebResponse

            response.Close();



        }

        catch (Exception ex)
        {

            //MessageBox.Show(ex.ToString());

            Deployment.Current.Dispatcher.BeginInvoke(() => { UpdatePostStatus("Error Uploading [GetResponseCallback]:", ex.ToString()); });

        }

    }

    #endregion



    #region ImageManipulation

    public BitmapImage GetImageFromIsolatedStorage(String ImageFileName)

    //Opens an image file in isolated storage and returns it as a

    //BitmapImage object we could use as the image in the PostData method
    {

        {

            using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplication())
            {

                // Open the file

                using (IsolatedStorageFileStream isfs = isf.OpenFile(ImageFileName, FileMode.Open, FileAccess.Read))
                {

                    //use the stream as the source of the Bitmap Image

                    BitmapImage bmpimg = new BitmapImage();

                    bmpimg.SetSource(isfs);

                    isfs.Close();

                    return bmpimg;

                }

            }

        }

    }





    private byte[] ImageToByteArray(BitmapImage bm_Image)

    //ImageToByteArray(BitmapImage) accepts a BitmapImage object and

    //converts it to a byte array we can use in the POST buffer
    {

        byte[] data;

        {

            // Get an Image Stream

            MemoryStream ms_Image = new MemoryStream();



            // write an image into the stream

            // System.Windows.Media.Imaging.Extensions.SaveJpeg(new WriteableBitmap(bm_Image), ms_Image, bm_Image.PixelWidth, bm_Image.PixelHeight, 0, 100);


            System.Windows.Media.Imaging.Extensions.SaveJpeg(new WriteableBitmap(bm_Image), ms_Image, 320, 320, 0, 100);


            // reset the stream pointer to the beginning

            ms_Image.Seek(0, 0);

            //read the stream into a byte array

            data = new byte[ms_Image.Length];

            ms_Image.Read(data, 0, data.Length);

            ms_Image.Close();

        }

        //data now holds the bytes of the image

        return data;

    }





    public BitmapImage GetBitmapImageFromUIElement(UIElement element)

    //GetBitmapImageFromUIElement accepts a UIElement (canvas, grid, image, etc...)

    //and builds a BitmapImage of it including any child elements
    {

        try
        {

            WriteableBitmap bmp = new WriteableBitmap((int)element.RenderSize.Width, (int)element.RenderSize.Height);

            bmp.Render(element, null);

            bmp.Invalidate();



            // Get an Image Stream

            MemoryStream ms_Image = new MemoryStream();



            // write the image into the stream

            bmp.SaveJpeg(ms_Image, (int)element.RenderSize.Width, (int)element.RenderSize.Height, 0, 100);

            // reset the stream pointer to the beginning

            ms_Image.Seek(0, 0);

            //use the stream as the source of the Bitmap Image

            BitmapImage bmpimg = new BitmapImage();

            bmpimg.SetSource(ms_Image);

            ms_Image.Close();



            return bmpimg;

        }

        catch (Exception ex)
        {

            UpdatePostStatus("Error Getting Bitmap from UIElement:", ex.Message);

            return null;

        }

    }

    #endregion



    #region Events code



    //Raise the PostStatus Event so the calling code knows whats going on

    private void UpdatePostStatus(string strHeader, string strContents)
    {

        if (PostStatus != null)
        {

            PostStatus(this, new PostStatusEventArgs(strHeader, strContents));

        }

    }

    public class PostStatusEventArgs : EventArgs
    {

        private readonly string msg_header = string.Empty;

        private readonly string msg_contents = string.Empty;

        // Constructor.



        public PostStatusEventArgs(string msgHeader, string msgContents)
        {

            this.msg_header = msgHeader;

            this.msg_contents = msgContents;

        }



        // Properties.

        public string MessageHeader { get { return msg_header; } }

        public string MessageContents { get { return msg_contents; } }

    }
    //the PostStatus Event sends status updates

    public delegate void PostStatusEventHandler(object sender,PostStatusEventArgs e);

    public event PostStatusEventHandler PostStatus;

    #endregion
}

1 个答案:

答案 0 :(得分:0)

无论是否选择了照片,

PhotoChooserTask.Completed都会被提升。您应该检查TaskResultPhotoResult属性,只上传照片的值为TaskResult.OK

您的兼容性问题可能与快速应用切换有关。尝试在启用了逻辑删除的情况下在模拟器中运行应用程序(Project Properties :: Debug)并查看问题是否发生。