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[];
using (MemoryStream ms = new MemoryStream())
{ //返回结果后会自动回收调用该对象的Dispose方法释放内存
// 不停的读取
while (true)
{
int read = stream.Read(buffer, , buffer.Length);
// 直到读取完最后的3M数据就可以返回结果了
if (read <= )
return ms.ToArray();
ms.Write(buffer, , read);
}
}
}

WCF图片上传的更多相关文章

  1. 利用WCF与Android实现图片上传并传参

    利用WCF与Android实现图片上传并传参 最近做一个项目后端使用WCF接收Android手机拍照并带其它参数保存到服务器里:刚好把最近学习的WCF利用上,本以为是个比较简单的功能应该很好实现,没想 ...

  2. C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi

    C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...

  3. Asp.Net Mvc 使用WebUploader 多图片上传

    来博客园有一个月了,哈哈.在这里学到了很多东西.今天也来试着分享一下学到的东西.希望能和大家做朋友共同进步. 最近由于项目需要上传多张图片,对于我这只菜鸟来说,以前上传图片都是直接拖得控件啊,而且还是 ...

  4. 06.LoT.UI 前后台通用框架分解系列之——浮夸的图片上传

    LOT.UI分解系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#lotui LoT.UI开源地址如下:https://github.com/du ...

  5. JS图片上传预览插件制作(兼容到IE6)

    其实,图片预览功能非常地常见.很意外,之前遇到上传图片的时候都不需要预览,也一直没有去实现过.现在手上的项目又需要有图片预览功能,所以就动手做了一个小插件.在此分享一下思路. 一.实现图片预览的一些方 ...

  6. HTML5笔记:跨域通讯、多线程、本地存储和多图片上传技术

    最近做项目在前端我使用了很多新技术,这些技术有bootstrap.angularjs,不过最让我兴奋的还是使用了HTML5的技术,今天我想总结一些HTML5的技术,好记性不如烂笔头,写写文章可以很好的 ...

  7. 对百度的UEditor多图片上传的一些补充

    我已经写了一篇文章关于百度的UEditor提取多图片上传模块.如果还没有看过,请点击以下链接查看 http://www.cnblogs.com/luke1006/p/3719029.html 出差了两 ...

  8. 使用localResizeIMG3+WebAPI实现手机端图片上传

    前言 惯例~惯例~昨天发表的使用OWIN作为WebAPI的宿主..嗯..有很多人问..是不是缺少了什么 - - 好吧,如果你要把OWIN寄宿在其他的地方...代码如下: namespace Conso ...

  9. TinyMCE的使用(包括汉化及本地图片上传功能)

    TinyMCE我就不多介绍了,这是下载地址:https://www.tinymce.com/download/ 下载下来是英文版,要汉化也很简单.首先去网上随便下载个汉化包,然后把汉化包解压后的lan ...

随机推荐

  1. java条件选择学习

    boolean类型用于声明布尔型变量,只能是true或false中的一个 boolean lightOn = true; 一个简单的数学学习工具: public class Main { public ...

  2. 利用XSD配合XSLT產出特定格式Word檔案 -摘自网络

    利用類別產生XSD檔 產出XSD檔的目的在於提供Word樣板設計之資料框架 在此使用微軟提供之XML Schema Definition Tool (Xsd.exe)工具產生XSD檔 1. 定義類別 ...

  3. work2

    回答问题: 描述在这么多相似的需求面前, 你怎么维护你的设计 (父类/子类/基类, UML, 设计模式,  或者其它方法) 让整个程序的架构不至于崩溃的? 答:诚然,问题给出了很多选项如-a,-v,- ...

  4. Java管道流PipedStream

    管道读取流和管道写入流可以像管道一样对接上,管道读取流就可以读取管道写入流写入的数据.需要注意的是需要加入多线程技术,因为单线程,先执行read,会发生死锁,因为read方法是阻塞式的,没有数据的re ...

  5. SQL Server 2016原生支持JSON

    转载原地址: http://www.cnblogs.com/lyhabc/p/4747694.html SQL Server 2005 开始支持 XML 数据类型,提供原生的 XML数据类型.XML ...

  6. C#- 实用的Log4Net日志记录例子

    工作中也是要用到日志记录的,LOG4NET在这块做的不错,以后可以继续拿来用. 1.引用DLL 2.LOG4NET的配置文件 <?xml version="1.0" enco ...

  7. NSTimer运行机制和线程问题

    A.首先要理解NSTimer运行机制和Runloop之间的关系: 1.IOS的Run Loops机制 Run Loops是线程的基础部份,任何线程,包括主结程,都包含了一个run loop对象,Coc ...

  8. Android进阶之大话设计模式

    一般来说,常用的设计模式有以下八种:单例.工厂.观察者.代理.命令.适配器.合成.访问者 单例模式:目的是为了让系统中只有一个调用对象,缺点是单例使其他程序过分依赖它,而且不同单例运行在不同进程中,使 ...

  9. 创建性能监视器(logman)

    在本地计算机上抓取性能信息 Logman.exe create counter Perf-1Second -f bincirc -max 500 -c "\Processor(*)\% Pr ...

  10. C#-datagridview设置列宽

    在使用datagridview的显示数据的过程中,常常会遇到需要设定datagridview的列宽,这就需要用到datagridview的属性: autosizemode