2012-12-19 3 views
3

내가하고 싶은 일은 모노 터치/모노 드로이드와 mvvmcross를 사용하여 웹 서비스에 사진을 업로드하는 것입니다. 한 번만 코드를 작성하면됩니다. 안드로이드와 IOS 모두 :mvvmcross 및 모노 터치로 웹 서비스에 사진 업로드

내 초기 아이디어는 사용자가 이미지를 (안드로이드에서 의도를 사용하여) 선택 이미지의 경로를 얻을 수 있습니다. 그런 다음 MvxResourceLoader resourceLoader를 사용하여 경로에서 스트림을 열고 restsharp를 사용하여 스트림에서 게시물 요청을 만듭니다.

그러나 이미 벽을 치고 사용자가 이미지를 선택할 때 경로가 예를 들어 "/ external/images/media/13". MvxResourceLoader resourceLoader를 사용할 때이 경로로 인해 파일을 찾을 수없는 예외가 발생합니다.

왜 예외가 발생하는지 또는 내 목표를 달성하기위한 더 좋은 방법이 있습니까?

답변

3

을 복용에 대한 Xam.Mobile를 사용합니다 - 당신에게 스튜어트와에 감사합니다 모든 링크 :

public class PhotoService :IPhotoService, IMvxServiceConsumer<IMvxPictureChooserTask>,IMvxServiceConsumer<IAppSettings> 
    { 
     private const int MaxPixelDimension = 300; 
     private const int DefaultJpegQuality = 64; 

     public void ChoosePhotoForEventItem(string EventGalleryId, string ItemId) 
     { 
     this.GetService<IMvxPictureChooserTask>().ChoosePictureFromLibrary(
       MaxPixelDimension, 
       DefaultJpegQuality, 
       delegate(Stream stream) { UploadImage(stream,EventGalleryId,ItemId); }, 
       () => { /* cancel is ignored */ }); 

     } 

     private void UploadImage(Stream stream, string EventGalleryId, string ItemId) 
     { 
      var settings = this.GetService<IAppSettings>(); 
      string url = string.Format("{0}/EventGallery/image/{1}/{2}", settings.ServiceUrl, EventGalleryId, ItemId); 
      var uploadImageController = new UploadImageController(url); 

      uploadImageController.OnPhotoAvailableFromWebservice +=PhotoAvailableFromWebservice; 

      uploadImageController.UploadImage(stream,ItemId); 

     } 
    } 

    public class PhotoStreamEventArgs : EventArgs 
    { 
     public Stream PictureStream { get; set; } 

     public Action<string> OnSucessGettingPhotoFileName { get; set; } 

     public string URL { get; set; } 
    } 

    public class UploadImageController : BaseController, IMvxServiceConsumer<IMvxResourceLoader>, IMvxServiceConsumer<IErrorReporter>, IMvxServiceConsumer<IMvxSimpleFileStoreService> 
    { 

     public UploadImageController(string uri) 
      : base(uri) 
     { 

     } 
     public event EventHandler<PhotoStreamEventArgs> OnPhotoAvailableFromWebservice; 


     public void UploadImage(Stream stream, string name) 
     { 
      UploadImageStream(stream, name); 
     } 


     private void UploadImageStream(Stream obj, string name) 
     { 

      var request = new RestRequest(base.Uri, Method.POST); 

      request.AddFile("photo", ReadToEnd(obj), name + ".jpg", "image/pjpeg"); 

      //calling server with restClient 
      var restClient = new RestClient(); 

      try 
      { 

       this.ReportError("Billedet overføres", ErrorEventType.Warning); 

       restClient.ExecuteAsync(request, (response) => 
       { 
        if (response.StatusCode == HttpStatusCode.OK) 
        { 
         //upload successfull 
         this.ReportError("Billedet blev overført", ErrorEventType.Warning); 
         if (OnPhotoAvailableFromWebservice != null) 
         { 
          this.OnPhotoAvailableFromWebservice(this, new PhotoStreamEventArgs() { URL = base.Uri }); 
         } 
        } 
        else 
        { 
         //error ocured during upload 
         this.ReportError("Billedet kunne ikke overføres \n" + response.StatusDescription, ErrorEventType.Warning); 
        } 
       }); 
      } 
      catch (Exception e) 
      { 

       this.ReportError("Upload completed succesfully...", ErrorEventType.Warning); 
       if (OnPhotoAvailableFromWebservice != null) 
       { 
        this.OnPhotoAvailableFromWebservice(this, new PhotoStreamEventArgs() { URL = url }); 
       } 
      } 


     } 

     //method for converting stream to byte[] 

     public byte[] ReadToEnd(System.IO.Stream stream) 
     { 
      long originalPosition = stream.Position; 
      stream.Position = 0; 
      try 
      { 
       byte[] readBuffer = new byte[4096]; 
       int totalBytesRead = 0; 
       int bytesRead; 
       while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0) 
       { 
        totalBytesRead += bytesRead; 
        if (totalBytesRead == readBuffer.Length) 
        { 

         int nextByte = stream.ReadByte(); 
         if (nextByte != -1) 
         { 
          byte[] temp = new byte[readBuffer.Length * 2]; 
          Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length); 
          Buffer.SetByte(temp, totalBytesRead, (byte)nextByte); 
          readBuffer = temp; 
          totalBytesRead++; 
         } 

        } 
       } 

       byte[] buffer = readBuffer; 
       if (readBuffer.Length != totalBytesRead) 
       { 
        buffer = new byte[totalBytesRead]; 
        Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead); 
       } 
       return buffer; 
      } 
      finally 
      { 
       stream.Position = originalPosition; 
      } 
     } 

    } 
+0

RestSharp를 사용하고 있습니까? – iwayneo

관련 문제