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. fragment中listview触发事件setOnItemClickListener不好使

    <listView/>中// listview点击 ,高度wrap_content改成fill_prarent

  2. 远程监控 – 应用程序运行状况测量 CSF 博客

    在远程监控基础知识和故障排除中,我们探讨了 Windows Azure 平台提供的基础指标.信息源.工具和脚本,介绍了有关监控和应用程序运行状况的基本原则.我们演示了如何利用这些基本原则对在 Wind ...

  3. ckeditor编辑器在java项目中配置

    一.基本使用: 1.所需文件架包 A. Ckeditor基本文件包,比如:ckeditor_3.6.2.zip 下载地址:http://ckeditor.com/download 2.配置使用 A.将 ...

  4. 在JavaScript的数组中进行数组元素查找和替换(JS的indexOf等)

    <html> <head> <title> Extend JavaScript Array Method </title> <script lan ...

  5. 网易云课堂_C语言程序设计进阶_第二周:指针:取地址运算和指针、使用指针、指针与数组、指针与函数、指针与const、指针运算、动态内存分配_2信号报告

    2 信号报告(5分) 题目内容: 无线电台的RS制信号报告是由三两个部分组成的: R(Readability) 信号可辨度即清晰度. S(Strength)    信号强度即大小. 其中R位于报告第一 ...

  6. CSU - 1356 Catch(dfs染色两种写法,和hdu4751比较)

    Description A thief is running away! We can consider the city to N–. The tricky thief starts his esc ...

  7. hdu 5583 Kingdom of Black and White(模拟,技巧)

    Problem Description In the Kingdom of Black and White (KBW), there are two kinds of frogs: black fro ...

  8. Gunner II(二分,map,数字转化)

    Gunner II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  9. OAuthBase.cs

    using System; using System.Security.Cryptography; using System.Collections.Generic; using System.Tex ...

  10. 执行SQL存储脚本

    using System.Data.SqlClient; static void Main(string[] args) { string connString = @"Data Sourc ...