当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > HTTP协议下用Web Service上传大文件的解决方案

ASP.NET
使用函数传递参数来执行相应的数据库操作
如何实现在窗体和窗体之间进行传递数据
ASP.NET中文显示之两种解决方法
ASP.NET、JSP及PHP之间的抉择
ASP.NET 2.0发送电子邮件中存在的问题
谈谈HtmlControl与WebControl的区别与用途
从ASP.NET 1.1升级到ASP.NET 2.0要考虑的Cookie问题
通过系统配置来提高ASP.NET应用程序的稳定性
妙用ASP2.0中的URL映射改变网址
AJAX实现web页面中级联菜单的设计
ASP.NET跨页面传值技巧总结
再议ASP.NET DataGrid控件中的“添加新行”功能
Geometry 对象浅析
重构CollapsibleSplitter
如何利用.NET Framework使用RSS feed
ASP.NET获取IP与MAC地址的方法
在ASP.NET 2.0中使用样式、主题和皮肤
ASP.NET中为GridView添加删除提示框
ASP.NET 2.0,无刷新页面新境界
看看一个.net版对话框控件

ASP.NET 中的 HTTP协议下用Web Service上传大文件的解决方案


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-13   浏览: 66 ::
收藏到网摘: n/a

用HTTP协议上传大文件也许是个不好办的问题。主要是它的不连续性,使得上传文件感觉很“危险”。特别是很大的文件(几百MB甚至是上G的文件),心里总觉得不踏实,一不小心就会出现问题,而一但出现问题就无法继续上传,这是很郁闷的。
后来在一些网站上找到一些上传文件的组件,但都是要用到一些COM组件。至于后来的ASP.net下上传大文件的解决方案,我也做过一个组件,后来发现根本就不用自己写什么组件,利用ASP.net自己的上传方法也可以解决大文件上传,真是郁闷的要死了。。。。
回想之后,决定用Web service来做一个文件上传,还是利用HTTP协议,这样不用在服务器上做太多的变动,而客户端也简单。
首先是解决方案的设计:因为Web service可以利用SOAP来传递数据,而且可以传递十进制数据,因此可以想到,在服务上公开一个方法,参数可以是byte数组,这样可以把文件分块的上传到服务器。这一解决方法我做过,但速度很慢。后来在MS上找到一些文章,用MS最新公开的服务组件上传文件,速度快了很多。而自己所要做的就是组织一些安全性的问题。
部份代码:Upload Instance
复制代码 代码如下:

using System;
using System.IO;
using Microsoft.Web.Services2;
using Microsoft.Web.Services2.Dime;
namespace Webb.WAVE.WinUpload
{
/**//// <summary>
/// Summary description for Controls.
/// </summary>
public class UploadInstance2
{
Fields#region Fields
private string m_GUID;
private DateTime m_uploadTime;
private long m_fileLength;
private long m_currentPoint;
private string m_pathOnserver;
private long m_userID;
#endregion
Properties#region Properties
public long UserID
{
get{return this.m_userID;}
set{this.m_userID=value;}
}
public string GUID
{
get{return this.m_GUID;}
set{this.m_GUID=value;}
}
public DateTime UploadTime
{
get{return this.m_uploadTime;}
set{}
}
public long FileLength
{
get{return this.m_fileLength;}
set{this.m_fileLength=value;}
}
public long CurrentPoing
{
get{return this.m_currentPoint;}
set{this.m_currentPoint=value;}
}
public string PathOnServer
{
get{return this.m_pathOnserver;}
set{this.m_pathOnserver=value;}
}
public string FullPathOnServer
{
get
{
if(this.m_GUID!=string.Empty&&this.m_pathOnserver!=string.Empty)
{
return Path.Combine(this.m_pathOnserver,this.m_GUID+".rem");
}
else
{
return string.Empty;
}
}
}
public string FileName
{
get
{
if(this.m_GUID!=string.Empty)
{
return this.m_GUID+".rem";
}
else
{
return string.Empty;
}
}
}
#endregion
public UploadInstance2()
{
this.m_GUID = System.Guid.NewGuid().ToString();
this.m_uploadTime = System.DateTime.Now;
this.m_currentPoint = 0;
this.m_fileLength = 0;
this.m_pathOnserver = string.Empty;
}
public UploadInstance2(string i_path,string i_GUID,long i_fileLength)
{
string m_fullPath = Path.Combine(i_path,i_GUID);
if(!File.Exists(m_fullPath)) return;
this.m_GUID = i_GUID;
this.m_uploadTime = System.DateTime.Now;
this.m_pathOnserver = i_path;
FileInfo m_fileInfo = new FileInfo(m_fullPath);
this.m_currentPoint = m_fileInfo.Length;
this.m_fileLength = i_fileLength;
}
public bool UploadData(byte[] i_data, long i_currentPoint, int i_dataSize)
{
string m_fullPath = this.FullPathOnServer;
if(!File.Exists(m_fullPath)&&this.m_currentPoint!=0)return false;
long m_filePoint = new FileInfo(m_fullPath).Length;
if(m_filePoint!=i_currentPoint) return false;
FileStream m_fileStream = new FileStream(m_fullPath,FileMode.Append);
m_fileStream.Write(i_data,0,i_dataSize);
m_fileStream.Close();
return true;
}
public void AbandantUpload()
{
string m_fullPath = this.FullPathOnServer;
try{File.Delete(m_fullPath);}
catch{}
}
public void CreateFile()
{
string m_fullPath = this.FullPathOnServer;
if(!File.Exists(m_fullPath))
{
File.Create(m_fullPath).Close();
}
else
{
try
{
File.Delete(m_fullPath);
}catch{}
File.Create(m_fullPath).Close();
}
}
}
}

上传过程:
复制代码 代码如下:

#region UploadProcess
public void UploadProcess()
{
DateTime m_start = DateTime.Now;
this.textBox_OutMsg.AppendText("Initialize upload\r\n");
if(this.m_upload==null||this.m_uploadGUID==null||this.m_uploadGUID==string.Empty)
{
this.textBox_OutMsg.AppendText("Upload instance id error or login to the server faild\r\n");
this.textBox_OutMsg.AppendText("Upload faild.\r\n");
return;
}
this.textBox_OutMsg.AppendText("Open file\r\n");
if(this.m_filePath==null||this.m_filePath==string.Empty||!File.Exists(this.m_filePath))
{
this.textBox_OutMsg.AppendText("Open file error\r\n");
this.textBox_OutMsg.AppendText("Upload faild.\r\n");
return;
}
FileInfo m_fileInfo = new FileInfo(this.m_filePath);
FileStream m_fs = new FileStream(this.m_filePath, FileMode.Open, FileAccess.Read);
this.textBox_OutMsg.AppendText("Start upload file\r\n");
int m_buffer = 10; //KBytes
long m_currentPoint = 0;
long m_fileLength = m_fileInfo.Length;
bool m_uploadResult = false;
byte[] m_data = new byte[m_buffer*1024];
long m_readBytes = m_fs.Read(m_data, 0, m_buffer*1024);
this.UploadProcessBar.Maximum = 100;
this.UploadProcessBar.Minimum = 0;
while(m_readBytes>0)
{
MemoryStream m_memoryStream = new MemoryStream(m_data, 0,(int)m_readBytes);
DimeAttachment dimeAttach = new DimeAttachment("image/gif", TypeFormat.MediaType, m_memoryStream);
this.m_upload.RequestSoapContext.Attachments.Add(dimeAttach);
m_uploadResult = this.m_upload.UploadFileData(this.m_uploadInstance,m_currentPoint,m_readBytes);
if(m_uploadResult)
{
m_currentPoint +=m_readBytes;
m_readBytes = m_fs.Read(m_data,0,m_buffer*1024);
// this.textBox_OutMsg.AppendText("Uploading:"+m_currentPoint.ToString()+"/"+m_fileLength.ToString()+"\r\n");
this.UploadProcessBar.Value = (int)(m_currentPoint*100/m_fileLength);
this.label_outPercent.Text = this.UploadProcessBar.Value.ToString()+"%";
}
else
{
this.textBox_OutMsg.AppendText("Upload file error.\r\n");
m_fs.Close();
this.m_upload.AbandantUpload(this.m_uploadInstance);
return;
}
}
this.textBox_OutMsg.AppendText("File upload finished.\r\n");
this.button_Cancel.Enabled = false;
m_fs.Close();
this.ResetForm();
}
#endregion

测试项目代码:
http://test.0579fw.com/myfile/kiyeer/客户上传/webbwinupload.zip
出现错误的解决方法:
*****************************************************
引用内容
Error 1 'WinFormTest.localhost.WebbWinUpload' does not contain a definition for 'RequestSoapContext' D:\WebbWinUpload\WinFormTest\WebbWinUpload.cs 448 19 WinFormTest
当你更新Web引用的时候,.net自动生成的Web引用为:
public class WebbWinUpload : System.Web.Services.Protocols.SoapHttpClientProtocol
请转化为:
public class WebbWinUpload : Microsoft.Web.Services2.WebServicesClientProtocol
查找引用下自动生成的C#文件Reference.cs