zoukankan      html  css  js  c++  java
  • 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);
                    }
                }
            }
  • 相关阅读:
    web安全:防止浏览器记住或自动填写用户名和密码(表单)的解决方案
    Sql CLR创建一个简单的表值函数
    html中实现某区域内右键自定义菜单
    HTML5单页框架View.js介绍
    Java使用apache的开源数据处理框架commons-dbutils完成查询结果集的各种处理输出(8种方式)
    【EAS】【BOS】如果使用BOS开发工具连接远程应用服务进行调试
    VSFTPD 550 Delete operation failed.
    两款不错的js甘特图控件
    我的node-webkit笔记
    node-webkit,nwjs 系统托盘【Tray】实践
  • 原文地址:https://www.cnblogs.com/xushaonian/p/3568229.html
Copyright © 2011-2022 走看看