WCF图片上传

WCF越来越流行,俺也在用,这是废话。项目中遇到需要图片上传,但是wcf上传会遇到一些异常,调试了N久,找了好多个解决方案才最终解决。代码直接贴上了

        /// <summary>
        /// 笔记图片上传
        /// </summary>
        /// <param name="image"></param>
        /// <returns></returns>
        [OperationContract]
        [WebInvoke(RequestFormat = WebMessageFormat.Json, Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        public Stream NoteUpFile(Stream image)
        {
            dynamic dy = null;
            FileStream pFileStream = null;
            try
            {
                byte[] bytes = ReadFully(image);//Stream转byte[]

                string fileName = string.Format(@"Upload/Note/{0}.jpg", Utilitys.GetGuid);
string dirPath=System.AppDomain.CurrentDomain.BaseDirectory; if (!Directory.Exists(dirPath + @"Upload/Note/"))//如果不存在就创建file文件夹 { Directory.CreateDirectory(dirPath + @"Upload/Note/");//创建该文件夹 } string path = dirPath + fileName; pFileStream = new FileStream(path, FileMode.OpenOrCreate); pFileStream.Write(bytes, 0, bytes.Length); dy = new { code = "1", msg = "上传成功!", path = fileName }; } catch (Exception ex) { throw ex; } finally { if (pFileStream != null) pFileStream.Close(); } return Comm.GetStream(dy);//这个方法是将对象json序列化之后转换为Stream utf8模式,至于为什么要这样做只能说wcf太操蛋了 返回的json会多带一个 d:"" 酱紫的:{"d":"Hello World!"},完全正常!(这里的d:是微软自动为我们的数据加的一层壳) }

 我们将json转为流模式 就不会出现多一个D的问题了

/// <summary>
        /// 返回输出的字符
        /// </summary>
        /// <param name="dy">json的数据集合</param>
        /// <returns></returns>
        public static Stream GetStream(dynamic dy)
        {
            string jsonString = GkXsn.Com.Utility.JsonHelper.Serializer(dy);
            return new MemoryStream(Encoding.UTF8.GetBytes(jsonString));
        }

 

WCF并不支持Stream对象Length属性的序列化,也就是说,在客户端我们不能使用服务操作返回的Stream对象的Length属性。诸如stream.Length的调用会抛出NotSupportedException异常。采用此函数可解决上述问题
        /// <summary>/// Stream转byte[]/// </summary>
        /// <param name="stream"></param>
        /// <returns></returns>
        private byte[] ReadFully(Stream stream)
        {
            // 初始化一个32k的缓存 
            byte[] buffer = new byte[32768];
            using (MemoryStream ms = new MemoryStream())
            { //返回结果后会自动回收调用该对象的Dispose方法释放内存 
                // 不停的读取 
                while (true)
                {
                    int read = stream.Read(buffer, 0, buffer.Length);
                    // 直到读取完最后的3M数据就可以返回结果了 
                    if (read <= 0)
                        return ms.ToArray();
                    ms.Write(buffer, 0, read);
                }
            }
        }

 

posted @ 2014-02-26 07:45  冰魄少年  阅读(1001)  评论(0编辑  收藏  举报