急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题

时间:2022-08-28 20:02:06
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
如图,上传大文件的时候,有时候会出现这个问题,有时候不会。
该文件是2g的文件,小文件基本不会出现这个问题。

ftp站点是iis下面建的站点,请教高手指导,谢谢啦

32 个解决方案

#1


无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。

错误信息如上

#2


无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。

#3


报错的上面一句有问题,最后一个参数应该是上传文件的Length。给个邮箱,我发一份我上传图片带进度条的给你。

#4


引用 3 楼  的回复:
报错的上面一句有问题,最后一个参数应该是上传文件的Length。给个邮箱,我发一份我上传图片带进度条的给你。


这个应该是没问题的,如果是上传文件的length,那是一次性上传的时候那么做的。超大文件的时候,只能是分成小段,用do while 传,因为fs.read 里面的第二个参数是int类型,如果文件的length超过int的范围就不行了。

#6


引用 5 楼  的回复:
下载地址:http://download.csdn.net/detail/wellbeingzhang/4203203


你试过用你这个传过2g以上的文件么

#7


http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebresponse.statuscode.aspx
我按照msdn里面来写的,有时候就出现这个

“无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。 “的错误

有时候上传虽然成功,但是2个文件的md5值不一样,很费解。求指教

#8


引用 5 楼  的回复:
下载地址:http://download.csdn.net/detail/wellbeingzhang/4203203


兄弟换在么

#9


你试试把bufferLength 设置的小一点比如说2048 试试

#10


引用 9 楼  的回复:
你试试把bufferLength 设置的小一点比如说2048 试试

嗯,我试了一下,如果每次传输的值小的话,出现的概率变小,5次有1次出现那个bug,但是传输速度也慢了,为什么不能设大点,我发现好像值越大,出现问题的概率越大,我想每次传输的是1048576,不知道怎么弄能 解决这个问题,而且值可以设大点。不出现这个bug

#11


来个大侠帮帮忙啊

#12


没人来。。。。。。。。。。。。。。。。。。。

#13


帮顶一下,同求

#14


楼主还没解决哇,我也想知道

#15


等着看解决结果

#16


引用 13 楼  的回复:
帮顶一下,同求


亲,感谢帮顶啊

#17


引用 15 楼  的回复:
等着看解决结果

谢谢!热泪盈眶中

我单独开了个线程做这个事情也不行,给那个rstream加了个lock也不行,继续

#18


IIS接收文件么?

#19


IIS配置的最大传输大小。

#20


iis 面的ftp 服务器,可以接受文件,我这个问题是有时候出现这个情况,有时候不出
里面没有配置最大最大传输大小的地方,不是iis网站

#21


站点属性里面是找不到的。在IIS的配置文件里面

#22


引用 21 楼  的回复:
站点属性里面是找不到的。在IIS的配置文件里面


那个跟这个没关系的吧,因为我如果把bufferLength设小的话,2g的文件也可以的,只不过,偶尔出现那个bug

#23


引用 21 楼  的回复:
站点属性里面是找不到的。在IIS的配置文件里面


你说的是iis站点上传的大小控制,和这个ftp站点是不一样的,ftp上传限制好像和这个不是一起的

#24


兄弟,你这样上传文件不行啊要。我看你的目的是在网站里面实现大文件上传功能。但是你在网页里面使用的FTP方式,向服务端来传文件。这个思路不行,一般都是借助于控件来实现的。比如QQ邮箱中的超大附件上传控件,115网盘中的大附件上传控件,DBank(华为网盘)中的大附件上传控件,金山网盘中的大文件上传控件都是用控件来做的。

#25


楼主是想实现这样的效果么?在Web页面中实现超大附件断点续传功能?
文件MD5值计算进度:
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
文件MD5值计算完毕
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
服务器根据MD5检测是否存在相同文件
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
续传文件
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
从服务器加载文件列表
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
文件上传中
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
文件上传完毕
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
上传文件夹
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题

#26


引用 24 楼  的回复:
兄弟,你这样上传文件不行啊要。我看你的目的是在网站里面实现大文件上传功能。但是你在网页里面使用的FTP方式,向服务端来传文件。这个思路不行,一般都是借助于控件来实现的。比如QQ邮箱中的超大附件上传控件,115网盘中的大附件上传控件,DBank(华为网盘)中的大附件上传控件,金山网盘中的大文件上传控件都是用控件来做的。

不是的,不是网站里实现大文件上传,而是专门做一个winform程序,上传文件到ftp服务器的。谢谢

#27


引用 25 楼  的回复:
楼主是想实现这样的效果么?在Web页面中实现超大附件断点续传功能?
文件MD5值计算进度:

文件MD5值计算完毕

服务器根据MD5检测是否存在相同文件

续传文件

从服务器加载文件列表

文件上传中

文件上传完毕

上传文件夹


你这个是web页面的,http上传的,不知道有没有ftp上传的,你用的是什么方法来实现的呢,是微软自带的类么。 和我的需求有所偏差

ftpwebrequest里面你说的这些功能也可以实现的,只不过现在我这个环境里出现bug,所以想请求高人指导一下,公司内部网络,用的代理,我设ftpwebrequest的代理为null啦,有时候可以成功不出现1楼的问题,有时候就出现。不知道是不是公司内部网络不稳定的原因

#28


我刚刚测试了一下,ftp配置的localhost,然后本地网络给关闭掉,虚拟机的网络也关闭掉,也是传到中途就断的,每次断的时候已传输的大小不一样

#29


试试在别的机子上行不行呢

#30


http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.usepassive.aspx

ftp服务器不同,你将这个UsePassive属性设为false试试,默认是true,表示服务器被动模式,大部分时候这种模式是比 服务器主动模式要好,但是ftp服务器不同,防火墙不同,所以呢,你设为false试试。

#31


引用 29 楼  的回复:
试试在别的机子上行不行呢

嗯,我在自己另外一台电脑上又是可以的,很奇怪

#32


引用 30 楼  的回复:
http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.usepassive.aspx

ftp服务器不同,你将这个UsePassive属性设为false试试,默认是true,表示服务器被动模式,大部分时候这种模式是比 服务器主动模式要好,但是ftp服务器不同,防火墙不同,所以呢,你设为false试试。


爱死你了,经过测试吧,改为false后,在我这台机子上确实没问题了,而且我那个bufferLength 改为10m,都没问题啊

测试代码如下:
      
 FtpWebRequest myRequest = null;
        Stream rStream = null;//ftp请求流
        FileStream fs = null;
        private void button1_Click(object sender, EventArgs e)
        {
            myRequest = (FtpWebRequest)WebRequest.Create(textBox2.Text);//创建ftp请求对象
            if (networkCredential == null)
            {
                networkCredential = new NetworkCredential("test123", "123456");
            }
            myRequest.Credentials = networkCredential;//设置ftp通讯凭证
            myRequest.KeepAlive = true;
            myRequest.ReadWriteTimeout = System.Threading.Timeout.Infinite;
            myRequest.Method = WebRequestMethods.Ftp.UploadFile;
            myRequest.Timeout = System.Threading.Timeout.Infinite;
            myRequest.Proxy = null;
            myRequest.UsePassive = false;
            rStream = myRequest.GetRequestStream();//创建ftp请求流
            fs = File.OpenRead(textBox1.Text);//io流
            const int bufferLength = 10485760;//1048576
            byte[] myBuffer = new byte[bufferLength];
            
            int iFlag = 0;
            long count = 0;
            do
            {
                iFlag = fs.Read(myBuffer, 0, bufferLength);
                rStream.Write(myBuffer, 0, iFlag);
                count += iFlag;
            } while (iFlag!=0);
            fs.Close();//文件流
            rStream.Close();

            FtpWebResponse myResponse = (FtpWebResponse)myRequest.GetResponse();
            myResponse.Close();

            MessageBox.Show("yes");
        }

#1


无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。

错误信息如上

#2


无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。

#3


报错的上面一句有问题,最后一个参数应该是上传文件的Length。给个邮箱,我发一份我上传图片带进度条的给你。

#4


引用 3 楼  的回复:
报错的上面一句有问题,最后一个参数应该是上传文件的Length。给个邮箱,我发一份我上传图片带进度条的给你。


这个应该是没问题的,如果是上传文件的length,那是一次性上传的时候那么做的。超大文件的时候,只能是分成小段,用do while 传,因为fs.read 里面的第二个参数是int类型,如果文件的length超过int的范围就不行了。

#5


#6


引用 5 楼  的回复:
下载地址:http://download.csdn.net/detail/wellbeingzhang/4203203


你试过用你这个传过2g以上的文件么

#7


http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebresponse.statuscode.aspx
我按照msdn里面来写的,有时候就出现这个

“无法将数据写入传输连接: 远程主机强迫关闭了一个现有的连接。。 “的错误

有时候上传虽然成功,但是2个文件的md5值不一样,很费解。求指教

#8


引用 5 楼  的回复:
下载地址:http://download.csdn.net/detail/wellbeingzhang/4203203


兄弟换在么

#9


你试试把bufferLength 设置的小一点比如说2048 试试

#10


引用 9 楼  的回复:
你试试把bufferLength 设置的小一点比如说2048 试试

嗯,我试了一下,如果每次传输的值小的话,出现的概率变小,5次有1次出现那个bug,但是传输速度也慢了,为什么不能设大点,我发现好像值越大,出现问题的概率越大,我想每次传输的是1048576,不知道怎么弄能 解决这个问题,而且值可以设大点。不出现这个bug

#11


来个大侠帮帮忙啊

#12


没人来。。。。。。。。。。。。。。。。。。。

#13


帮顶一下,同求

#14


楼主还没解决哇,我也想知道

#15


等着看解决结果

#16


引用 13 楼  的回复:
帮顶一下,同求


亲,感谢帮顶啊

#17


引用 15 楼  的回复:
等着看解决结果

谢谢!热泪盈眶中

我单独开了个线程做这个事情也不行,给那个rstream加了个lock也不行,继续

#18


IIS接收文件么?

#19


IIS配置的最大传输大小。

#20


iis 面的ftp 服务器,可以接受文件,我这个问题是有时候出现这个情况,有时候不出
里面没有配置最大最大传输大小的地方,不是iis网站

#21


站点属性里面是找不到的。在IIS的配置文件里面

#22


引用 21 楼  的回复:
站点属性里面是找不到的。在IIS的配置文件里面


那个跟这个没关系的吧,因为我如果把bufferLength设小的话,2g的文件也可以的,只不过,偶尔出现那个bug

#23


引用 21 楼  的回复:
站点属性里面是找不到的。在IIS的配置文件里面


你说的是iis站点上传的大小控制,和这个ftp站点是不一样的,ftp上传限制好像和这个不是一起的

#24


兄弟,你这样上传文件不行啊要。我看你的目的是在网站里面实现大文件上传功能。但是你在网页里面使用的FTP方式,向服务端来传文件。这个思路不行,一般都是借助于控件来实现的。比如QQ邮箱中的超大附件上传控件,115网盘中的大附件上传控件,DBank(华为网盘)中的大附件上传控件,金山网盘中的大文件上传控件都是用控件来做的。

#25


楼主是想实现这样的效果么?在Web页面中实现超大附件断点续传功能?
文件MD5值计算进度:
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
文件MD5值计算完毕
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
服务器根据MD5检测是否存在相同文件
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
续传文件
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
从服务器加载文件列表
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
文件上传中
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
文件上传完毕
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题
上传文件夹
急,在线等,高手指导一下,FtpWebRequest 上传大文件出问题

#26


引用 24 楼  的回复:
兄弟,你这样上传文件不行啊要。我看你的目的是在网站里面实现大文件上传功能。但是你在网页里面使用的FTP方式,向服务端来传文件。这个思路不行,一般都是借助于控件来实现的。比如QQ邮箱中的超大附件上传控件,115网盘中的大附件上传控件,DBank(华为网盘)中的大附件上传控件,金山网盘中的大文件上传控件都是用控件来做的。

不是的,不是网站里实现大文件上传,而是专门做一个winform程序,上传文件到ftp服务器的。谢谢

#27


引用 25 楼  的回复:
楼主是想实现这样的效果么?在Web页面中实现超大附件断点续传功能?
文件MD5值计算进度:

文件MD5值计算完毕

服务器根据MD5检测是否存在相同文件

续传文件

从服务器加载文件列表

文件上传中

文件上传完毕

上传文件夹


你这个是web页面的,http上传的,不知道有没有ftp上传的,你用的是什么方法来实现的呢,是微软自带的类么。 和我的需求有所偏差

ftpwebrequest里面你说的这些功能也可以实现的,只不过现在我这个环境里出现bug,所以想请求高人指导一下,公司内部网络,用的代理,我设ftpwebrequest的代理为null啦,有时候可以成功不出现1楼的问题,有时候就出现。不知道是不是公司内部网络不稳定的原因

#28


我刚刚测试了一下,ftp配置的localhost,然后本地网络给关闭掉,虚拟机的网络也关闭掉,也是传到中途就断的,每次断的时候已传输的大小不一样

#29


试试在别的机子上行不行呢

#30


http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.usepassive.aspx

ftp服务器不同,你将这个UsePassive属性设为false试试,默认是true,表示服务器被动模式,大部分时候这种模式是比 服务器主动模式要好,但是ftp服务器不同,防火墙不同,所以呢,你设为false试试。

#31


引用 29 楼  的回复:
试试在别的机子上行不行呢

嗯,我在自己另外一台电脑上又是可以的,很奇怪

#32


引用 30 楼  的回复:
http://msdn.microsoft.com/zh-cn/library/system.net.ftpwebrequest.usepassive.aspx

ftp服务器不同,你将这个UsePassive属性设为false试试,默认是true,表示服务器被动模式,大部分时候这种模式是比 服务器主动模式要好,但是ftp服务器不同,防火墙不同,所以呢,你设为false试试。


爱死你了,经过测试吧,改为false后,在我这台机子上确实没问题了,而且我那个bufferLength 改为10m,都没问题啊

测试代码如下:
      
 FtpWebRequest myRequest = null;
        Stream rStream = null;//ftp请求流
        FileStream fs = null;
        private void button1_Click(object sender, EventArgs e)
        {
            myRequest = (FtpWebRequest)WebRequest.Create(textBox2.Text);//创建ftp请求对象
            if (networkCredential == null)
            {
                networkCredential = new NetworkCredential("test123", "123456");
            }
            myRequest.Credentials = networkCredential;//设置ftp通讯凭证
            myRequest.KeepAlive = true;
            myRequest.ReadWriteTimeout = System.Threading.Timeout.Infinite;
            myRequest.Method = WebRequestMethods.Ftp.UploadFile;
            myRequest.Timeout = System.Threading.Timeout.Infinite;
            myRequest.Proxy = null;
            myRequest.UsePassive = false;
            rStream = myRequest.GetRequestStream();//创建ftp请求流
            fs = File.OpenRead(textBox1.Text);//io流
            const int bufferLength = 10485760;//1048576
            byte[] myBuffer = new byte[bufferLength];
            
            int iFlag = 0;
            long count = 0;
            do
            {
                iFlag = fs.Read(myBuffer, 0, bufferLength);
                rStream.Write(myBuffer, 0, iFlag);
                count += iFlag;
            } while (iFlag!=0);
            fs.Close();//文件流
            rStream.Close();

            FtpWebResponse myResponse = (FtpWebResponse)myRequest.GetResponse();
            myResponse.Close();

            MessageBox.Show("yes");
        }