winfrom做文件上传的功能显然没有BS的简单,本实例是运用了webservice获取二进制流转换的字符串。然后,解析字符串,把流文件再转成pdf.

webservice 里面的代码为下:

  [WebMethod]
public bool Create(string Base64String, string name)
{
try
{
Stream stream = FromBase64String(Base64String);
using (FileStream fs = new FileStream("D:\\word\\" + name, FileMode.Create))
{
byte[] bytes = new byte[stream.Length];
int numBytesRead = ;
int numBytesToRead = (int)stream.Length;
stream.Position = ;
while (numBytesToRead > )
{
int n = stream.Read(bytes, numBytesRead, Math.Min(numBytesToRead, int.MaxValue));
if (n <= )
{
break;
}
fs.Write(bytes, numBytesRead, n);
numBytesRead += n;
numBytesToRead -= n;
}
fs.Close(); return true;
}
}
catch
{
return false;
}
}
/// <summary>
/// 返回一个只读流
/// </summary>
/// <param name="content">文件的二进制形式</param>
/// <returns></returns>
public static Stream FromBase64String(string content)
{
//临时文件
string file = Path.Combine("d://"+Guid.NewGuid().ToString()) + ".tmp"; try
{
using (Stream sw = new System.IO.FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))
{
//缓存
byte[] buff = new byte[*]; StringBuilder sb = new StringBuilder(content); int bufLenght = Convert.ToBase64String(buff).Length;
int startindex = ; //大于缓存数组大小的时候
while (sb.Length - startindex >= bufLenght)
{
buff = Convert.FromBase64String(sb.ToString(startindex, bufLenght));
//写入流
sw.Write(buff, , buff.Length);
startindex += bufLenght;
} //小于缓存数组的时候
if (sb.Length - startindex > )
{
buff = Convert.FromBase64String(sb.ToString(startindex, sb.Length - startindex));
sw.Write(buff, , buff.Length);
} sw.Close();
} return new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Delete);
}
finally
{
if (File.Exists(file))
{
File.Delete(file);
}
}
}

可能会疑问,为啥不直接传一个sream对象过来,反而要传个编码字符串过来,再解析,是不是做了无用功?其实我觉得也是。但是直接传递stream会报错的~

stream的类型无法转换(具体的错误可以自己试一试。此处不截图了。)也许有更好的方法,只是我没找到。

客户端调用webservice代码如下:

      private void button2_Click(object sender, EventArgs e)
{ WebReference.WebServiceasmx web = new WebReference.WebServiceasmx();
string str = FileToStream("d:\\word\\2014标准馆数据监控系统用户手册.pdf");
bool r = web.Create(str,"987.pdf");
MessageBox.Show(r.ToString());
}
/// <summary>
/// 从文件读取 Stream
/// </summary>
public string FileToStream(string fileName)
{
// 打开文件
FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read);
// 读取文件的 byte[]
byte[] bytes = new byte[fileStream.Length];
fileStream.Read(bytes, 0, bytes.Length);
fileStream.Close();
// 把 byte[] 转换成 Stream
Stream stream = new MemoryStream(bytes); return ToBase64String(stream);
} /// <summary>
/// 将流转换成字符串
/// </summary>
/// <param name="s">文件留</param>
/// <returns>流的字符形式</returns>
public static string ToBase64String(Stream s)
{ byte[] buff = null;
StringBuilder rtnvalue = new StringBuilder(); using (System.IO.BinaryReader br = new System.IO.BinaryReader(s))
{
do
{
buff = br.ReadBytes(BufferSize);
rtnvalue.Append(Convert.ToBase64String(buff)); } while (buff.Length != 0); br.Close();
}
return rtnvalue.ToString(); ;
}

当传递的文件大小超过4M的时候,会报错:

常日志信息:
运行配置文件中指定的扩展时出现异常。 ---> 超过了最大请求长度。
System.Web.Services.Protocols.SoapException: 运行配置文件中指定的扩展时出现异常。 ---> 超过了最大请求长度。
在 System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
在 System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
那么问题来了:为什么报错?怎么修改?
问题原因:
Asp.Net默认上传文件大小是4M,防止Ddos攻击。试想一下,如果不现在上传大小。。。。你的服务器会咋样。

解决方法1:
针对单个项目,只需修改Web.config就可以了,如下: 
< configuration>
< system.web>
< httpRuntime maxRequestLength = "40960"  executionTimeout="3600" />
< /system.web>
< /configuration>
限制最大长度是40M,超时时间1小时。

解决方法2
找到:C:/WINDOWS/Microsoft.NET/Framework/v1.1.4322/CONFIG/machine.config文件(版本及系统不同,目录稍有差异),找到“maxRequestLength="4096"”这行,将其中的4096换成较大的数值,单位是KB。

后记
httpRuntime 是配置asp.net http运行时设置,以确定如何处理对asp.net应用程序的请求。 
executionTimeout:表示允许执行请求的最大时间限制,单位为秒 
maxRequestLength:指示 ASP.NET 支持的最大文件上载大小。该限制可用于防止因用户将大量文件传递到该服务器而导致的拒绝服务攻击。指定的大小以 KB 为单位。默认值为 4096 KB (4 MB),最大值:2097151。 
useFullyQualifiedRedirectUrl:表示指示客户端重定向是否是完全限定的(采用 "http://server/path" 格式,这是某些移动控件所必需的),或者指示是否代之以将相对重定向发送到客户端。如果为 True,则所有不是完全限定的重定向都将自动转换为完全限定的格式。false 是默认选项。 
minFreeThreads:表示指定允许执行新请求的自由线程的最小数目。ASP.NET 为要求附加线程来完成其处理的请求而使指定数目的线程保持自由状态。默认值为 8。 
minLocalRequestFreeThreads:表示ASP.NET 保持的允许执行新本地请求的自由线程的最小数目。该线程数目是为从本地主机传入的请求而保留的,以防某些请求在其处理期间发出对本地主机的子请求。这避免了可能的因递归重新进入 Web 服务器而导致的死锁。 
appRequestQueueLimit:表示ASP.NET 将为应用程序排队的请求的最大数目。当没有足够的自由线程来处理请求时,将对请求进行排队。当队列超出了该设置中指定的限制时,将通过“503 - 服务器太忙”错误信息拒绝传入的请求。 
enableVersionHeader:表示指定 ASP.NET 是否应输出版本标头。Microsoft Visual Studio 2005 使用该属性来确定当前使用的 ASP.NET 版本。对于生产环境,该属性不是必需的,可以禁用.

winfrom运用webservice上传文件到服务器的更多相关文章

  1. WPF上传文件到服务器

    利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...

  2. Android上传文件至服务器(上)

    每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...

  3. android上传文件到服务器

    package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...

  4. Android端通过HttpURLConnection上传文件到服务器

    Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...

  5. joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸

    在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...

  6. android -上传文件到服务器

    android上传文件到服务器       重点:最好是设置好content-type这些参数的配置!     package com.spring.sky.image.upload.network; ...

  7. 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。

    用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...

  8. C 上传文件到服务器(含接收端源码)

    本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1067 实例向大家展示了如何用Visua ...

  9. C# FTP上传文件至服务器代码

    C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...

随机推荐

  1. json、map互转

    首先,json转map 方法一: Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create(); 或 Gs ...

  2. aix rksh 执行CLI命令行限制

    su padmin -C "lsdev -dev hdisk9 -attr| grep unique_id"rksh: lsdev: 0403-006 Execute permis ...

  3. IE 创建条件样式

    1.HTML 注释 <div id="header">Header Section</div> <!-- End Header Section Con ...

  4. Spring、控制反转与依赖注入(概念)

    Spring 一个开源的控制反转(Inversion of Control ,Ioc)和面向切面(AOP)的容器框架. 主要目的:简化开发 控制反转(Inversion of Control ,Ioc ...

  5. wx.Notebook

    wx.Notebook This class represents a notebook control, which manages multiple windows with associated ...

  6. BFS+状态压缩 HDU1429

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. JavaScript 中的面向对象的初步认识

    我在学习JS的面向对象编程的时候,总是有两个奇怪的问题. 第一个就是:面向对象在JS中很少用到... 可能是目前自己做的项目还是比较简单,前端方面的任务我几乎都是用面向过程的方式写的,所以就导致,我啃 ...

  8. 修改AspNetSqlMembershipProvider的密码规则

    在AspNetSqlMembershipProvider中,默认的密码规则为长度大于等于7,并且包含1个除字母和数字外的特殊字符,这项规则主要由minRequiredPasswordLength和mi ...

  9. CSS Unicode 编码

    CSS 中文字体 Unicode 编码表 在 CSS 中设置字体名称,直接写中文是可以的.但是在文件编码(GB2312.UTF-8 等)不匹配时会产生乱码的错误. 为此,在 CSS 直接使用 Unic ...

  10. Spring 4.0 中的 WebSocket 架构

    两年前,客户端与服务器端的全双工双向通信作为一个很重要的功能被纳入到WebSocket RFC 6455协议中.在HTML5中,WebSocket已经成为一个流行词,大家对这个功能赋予很多构想,很多时 ...