winfrom运用webservice上传文件到服务器
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上传文件到服务器的更多相关文章
- WPF上传文件到服务器
利用WebClient 上传文件到服务器 创建一个空网站,创建一个UploadFile.aspx项, 服务器报500错误:检查文件保存路径是否存在,检查文件大小限制 protected void Pa ...
- Android上传文件至服务器(上)
每一次都不能上首页,真悲催..管理员让我上一次首页? 很多时候我更愿意一个人写代码,与其在垃圾代码上改改改,我更愿意直接重构. 整洁的代码简单直接.整洁的代码如同优美的散文.整洁的代码从不隐藏设计者的 ...
- android上传文件到服务器
package com.spring.sky.image.upload.network; import java.io.DataOutputStream; import java.io.File; i ...
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- joomla安装插件报错:上传文件到服务器发生了一个错误。 过小的PHP文件上传尺寸
在安装joomla的AKeeba插件的时候报错如下:上传文件到服务器发生了一个错误. 过小的PHP文件上传尺寸.解决方法是修改php.ini文件,打开文件后搜索upload_max_filesize! ...
- android -上传文件到服务器
android上传文件到服务器 重点:最好是设置好content-type这些参数的配置! package com.spring.sky.image.upload.network; ...
- 用winscp从本地上传文件到服务器上出现复制文件到远端时错误。
用winscp从本地上传文件到服务器上出现复制文件到远端时错误. 错误码:4 服务器返回的错误消息:write failed 报错如下图所示: 分析过程: 1.刚开始以为是权限不够,后面上网查了一下是 ...
- C 上传文件到服务器(含接收端源码)
本文demo下载地址:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1067 实例向大家展示了如何用Visua ...
- C# FTP上传文件至服务器代码
C# FTP上传文件至服务器代码 /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo ...
随机推荐
- SQL PLUS远程连接
http://blog.csdn.net/wildin/article/details/5850252 这篇文章无敌了. Oracle sqlplus添加历史记录功能: http://www.cnbl ...
- 一种基于Qt的可伸缩的全异步C/S架构服务器实现(流浪小狗,六篇,附下载地址)
本文向大家介绍一种基于Qt的伸缩TCP服务实现.该实现针对C/S客户端-服务集群应用需求而搭建.连接监听.数据传输.数据处理均在独立的线程池中进行,根据特定任务不同,可安排负责监听.传输.处理的线程数 ...
- Android Studio优化之启用Shift+Ctrl+O导入所有的包
在使用Eclipse开发Android应用时,开发者往往会使用Shift+Ctrl+O快捷键来快速导入所有的包,和移除已经导入但还未使用的包.但这个快捷键在Android Studio没人是给有开启的 ...
- 用sql语句按周、按月、按季、按年统
原文地址:http://hi.baidu.com/%BD%F0%D3%F1kl_y/blog/item/1c368ffba9388476024f5645.html --按mySql语法统计按周,月,季 ...
- 网易云课堂_程序设计入门-C语言_第五周:函数_2完数
2 完数(5分) 题目内容: 一个正整数的因子是所有可以整除它的正整数.而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数.例如6=1+2+3(6的因子是1,2,3). 现在,你要写一个程序, ...
- 通过属性集名称获取属性集id
Mage::getModel('eav/entity_attribute_set')->load('属性集名称', 'attribute_set_name')->getAttributeS ...
- 【Leetcode】Set Matrix Zeroes
给定一个m x n的矩阵,如果某个元素为0,则把该元素所在行和列全部置0. Given a m x n matrix, if an element is 0, set its entire row a ...
- c++中冒号(:)和双冒号(::)的用法
1.冒号(:)用法 (1)表示机构内位域的定义(即该变量占几个bit空间) typedef struct _XXX{ unsigned ; unsigned char c; } ; XXX (2)构造 ...
- Oracle视图,序列及同义词、集合操作
一.视图(重点) 视同的功能:一个视图其实就是封装了一个复杂的查询语句.1.创建视图的语法:CREATE VIEW 视图名称 AS 子查询 范例:创建一个包含了20部门的视图CREATE VIEW e ...
- C++_nullptr
C++_nullptr null 0 nullptr 的区别