请教一个关于断点上传(不是下载)的问题.万分感谢。

时间:2021-01-27 09:32:28
项目中碰到了要求断点上传的需求,项目分为客户端(cs)和服务器端。因为需要经常向服务器端上传很大的文件(1g以下,几百兆吧)经常没有传完就断了。所以要求在客户端增加断点上传的功能。

功能简单描述:就是在客户端点击一个按钮或者链接,打开一个cs模式上传窗口,选择文件后确定开始向服务器端传递

原本想用ftp或者现成的组件,但因为项目特殊需求,所以不适用。现在我的考虑是用socket或者webservives在客户端把文件拆分一段一段的发送,每发送一次,在服务器端成功接收后,继续下一次发送,并通过一个xml文件在客户端记录下发送情况,当断了时,在通过读取xml进行继续上传

但是因为要求很快做出来,我又没有做过socket,webservies,所以一知半解中。例如我发送文件,我怎么能通知客户端什么时候传完,并且上传的文件存放在那一个目录下面等等。

有朋友做过这方面的程序,能够给与一些指点么。万分感谢。

8 个解决方案

#1


1:不要使用webservices,使用socket会比较好。
2:如果在局域网上,断点续传可以做简单点,只记录一个文件已经传完的位置即可,下次由这个位置启动上传。

#2


不是局域网,是互联网上

#3


MARK

#4



 static void Main(string[] args)  

{  

string StrFileName="c:\\aa.zip"; //根据实际情况设置  

string StrUrl="http://www.xxxx.cn/xxxxx.zip"; //根据实际情况设置  

//打开上次下载的文件或新建文件  

long lStartPos =0;  

System.IO.FileStream fs;  

if (System.IO.File.Exists(StrFileName))  

{  

fs= System.IO.File.OpenWrite(StrFileName);  

lStartPos=fs.Length;  

fs.Seek(lStartPos,System.IO.SeekOrigin.Current); //移动文件流中的当前指针  

}  

else  

{  

fs = new System.IO.FileStream(StrFileName,System.IO.FileMode.Create);  

lStartPos =0;  

}  

//打开网络连接  

try  

{  

System.Net.HttpWebRequest request =(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);  

if ( lStartPos>0)  

request.AddRange((int)lStartPos); //设置Range值  

//向服务器请求,获得服务器回应数据流  

System.IO.Stream ns= request.GetResponse().GetResponseStream();  

byte[] nbytes = new byte[512];  

int nReadSize=0;  

nReadSize=ns.Read(nbytes,0,512);  

while( nReadSize >0)  

{  

fs.Write(nbytes,0,nReadSize);  

nReadSize=ns.Read(nbytes,0,512);  

}  

fs.Close();  

ns.Close();  

Console.WriteLine("下载完成");  

}  

catch(Exception ex)  

{  

fs.Close();  

Console.WriteLine("下载过程中出现错误:"+ex.ToString());  

} }    
 

#5


谢谢楼上的代码,不过我需要的是上传,不是下载.如果大家没有例子,那么能否给与一些思路上的指点?

#6


之前我也想做这个,但是后来也是做不成

#7


和楼上一样一直想用socket做,但却一直没时间,现在就用2.0的ftp组件凑合着做上传下载,断点上传,我是只在每次需要重传的时候判断下服务器上的文件是否存在和大小比对来判断是否应该 append

#8


mark

#1


1:不要使用webservices,使用socket会比较好。
2:如果在局域网上,断点续传可以做简单点,只记录一个文件已经传完的位置即可,下次由这个位置启动上传。

#2


不是局域网,是互联网上

#3


MARK

#4



 static void Main(string[] args)  

{  

string StrFileName="c:\\aa.zip"; //根据实际情况设置  

string StrUrl="http://www.xxxx.cn/xxxxx.zip"; //根据实际情况设置  

//打开上次下载的文件或新建文件  

long lStartPos =0;  

System.IO.FileStream fs;  

if (System.IO.File.Exists(StrFileName))  

{  

fs= System.IO.File.OpenWrite(StrFileName);  

lStartPos=fs.Length;  

fs.Seek(lStartPos,System.IO.SeekOrigin.Current); //移动文件流中的当前指针  

}  

else  

{  

fs = new System.IO.FileStream(StrFileName,System.IO.FileMode.Create);  

lStartPos =0;  

}  

//打开网络连接  

try  

{  

System.Net.HttpWebRequest request =(System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(StrUrl);  

if ( lStartPos>0)  

request.AddRange((int)lStartPos); //设置Range值  

//向服务器请求,获得服务器回应数据流  

System.IO.Stream ns= request.GetResponse().GetResponseStream();  

byte[] nbytes = new byte[512];  

int nReadSize=0;  

nReadSize=ns.Read(nbytes,0,512);  

while( nReadSize >0)  

{  

fs.Write(nbytes,0,nReadSize);  

nReadSize=ns.Read(nbytes,0,512);  

}  

fs.Close();  

ns.Close();  

Console.WriteLine("下载完成");  

}  

catch(Exception ex)  

{  

fs.Close();  

Console.WriteLine("下载过程中出现错误:"+ex.ToString());  

} }    
 

#5


谢谢楼上的代码,不过我需要的是上传,不是下载.如果大家没有例子,那么能否给与一些思路上的指点?

#6


之前我也想做这个,但是后来也是做不成

#7


和楼上一样一直想用socket做,但却一直没时间,现在就用2.0的ftp组件凑合着做上传下载,断点上传,我是只在每次需要重传的时候判断下服务器上的文件是否存在和大小比对来判断是否应该 append

#8


mark