首页 > 其他 > 详细

WCF图片上传

时间:2014-02-26 19:42:20      阅读:380      评论:0      收藏:0      [点我收藏+]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/// <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);<br>                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的问题了

bubuko.com,布布扣
/// <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));
        }
bubuko.com,布布扣

 

WCF并不支持Stream对象Length属性的序列化,也就是说,在客户端我们不能使用服务操作返回的Stream对象的Length属性。诸如stream.Length的调用会抛出NotSupportedException异常。采用此函数可解决上述问题
bubuko.com,布布扣
        /// <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);
                }
            }
        }
bubuko.com,布布扣

WCF图片上传

原文:http://www.cnblogs.com/xushaonian/p/3568229.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!