【问题标题】:uploading photo to a webservice with mvvmcross and mono touch使用 mvvmcross 和 mono touch 将照片上传到 web 服务
【发布时间】:2012-12-19 18:23:40
【问题描述】:

我想做的只是使用 mono touch/mono droid 和 mvvmcross 将照片上传到 web 服务,希望在某种程度上我只需要为 android 和 IOS 编写一次代码 :)

我最初的想法是让用户选择一个图像(在 android 中使用意图)获取图像的路径。然后使用 MvxResourceLoader resourceLoader 从路径中打开一个流,然后使用 restsharp 创建一个带有流的 post 请求。

但是我已经碰壁了,当用户选择图像时,路径是例如“/外部/图像/媒体/13”。使用 MvxResourceLoader 资源加载器时,此路径导致文件未找到异常。

对我为什么会获得例外有任何想法,或者是否有更好的方法来实现我的目标?

【问题讨论】:

    标签: image post mono mvvmcross


    【解决方案1】:

    这就是我最终这样做的方式 - 谢谢斯图尔特和所有链接:)

    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;
                }
            }
    
        }
    

    【讨论】:

    • 这是在使用 RestSharp 吗?
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多