winfromFTP大文件上传问题。急!

问题描述

winfromFTP大文件上传问题。急!

winfrom使用FTP进行大文件上传时,没有加入线程的时候,上传上去,服务器直接把数据写入到文件,是可以断点续传的,但是用户界面假死;加入线程或者backgroundwork之后,用户界面不会假死,但是上传上去的文件没有及时的写入,关闭程序之后,服务器上面的文件什么都没有写入,还把之前的删掉了。请问有没有方法可以解决这个问题?急!!

解决方案

不知道你是怎么加入线程的。以及你是怎么上传的。该同步的有没有同步。

解决方案二:

我现在用的是backgroundwork.界面上有个上传按钮,点击按钮后开始这个方法。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (!client.Connected)
client.Connect();

        string[] dirs = client.Dir(remotingFolder + "");
        client.ChDir(remotingFolder);  //改变目录
        if (this.textBox1.Text != "")
        {
            bool flag = true;
            foreach (string dir in dirs)
            {
                string[] infos = dir.Split(' ');
                string info = infos[infos.Length - 1].Replace("r", "");
                FileInfo fileInfo = new FileInfo(this.textBox1.Text);
                string localfile = fileInfo.Name;

                if (info == localfile)//断点续传
                {
                    flag = false;
                    long remotingSize = client.GetFileSize(info);
                    long localSize = fileInfo.Length;

                    int i = (int)(remotingSize * 100 / localSize);
                    this.backgroundWorker1.ReportProgress(i,0);

                    if (remotingSize != localSize)
                    {
                        client.PutBrokenFile(info, remotingFolder, this.textBox1.Text, remotingSize);
                    }
                }
            }
            if (flag)
                client.Put(this.textBox1.Text);
        }
    }

解决方案三:

我现在用的是backgroundwork.界面上有个上传按钮,点击按钮后开始这个方法。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
if (!client.Connected)
client.Connect();

        string[] dirs = client.Dir(remotingFolder + "");
        client.ChDir(remotingFolder);  //改变目录
        if (this.textBox1.Text != "")
        {
            bool flag = true;
            foreach (string dir in dirs)
            {
                string[] infos = dir.Split(' ');
                string info = infos[infos.Length - 1].Replace("r", "");
                FileInfo fileInfo = new FileInfo(this.textBox1.Text);
                string localfile = fileInfo.Name;

                if (info == localfile)//断点续传
                {
                    flag = false;
                    long remotingSize = client.GetFileSize(info);
                    long localSize = fileInfo.Length;

                    int i = (int)(remotingSize * 100 / localSize);
                    this.backgroundWorker1.ReportProgress(i,0);

                    if (remotingSize != localSize)
                    {
                        client.PutBrokenFile(info, remotingFolder, this.textBox1.Text, remotingSize);
                    }
                }
            }
            if (flag)
                client.Put(this.textBox1.Text);
        }
    }

解决方案四:

上传代码如下:
///
/// 上传一批文件
///
/// 本地目录(不得以结束)
/// 文件名匹配字符(可以包含*和?)
public void Put(string strFolder, string strFileNameMask)
{
string[] strFiles = Directory.GetFiles(strFolder, strFileNameMask);
foreach (string strFile in strFiles)
{
//strFile是完整的文件名(包含路径)
Put(strFile);
}
}

    /// <summary>
    /// 上传一个文件
    /// </summary>
    /// <param name="strFileName">本地文件名</param>
    public void Put(string strFileName)
    {
        if (!bConnected)
        {
            Connect();
        }
        Socket socketData = CreateDataSocket();
        SendCommand("STOU " + Path.GetFileName(strFileName));
        long size = new FileInfo(strFileName).Length;
        if (!(iReplyCode == 125 || iReplyCode == 150))
        {
            throw new IOException(strReply.Substring(4));
        }
        FileStream input = new
        FileStream(strFileName, FileMode.Open);

        int iBytes = 0;
        long current = 0;
        while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            int i = socketData.Send(buffer, iBytes, 0);
            current += i;
            keepProgress(current, size);
        }
        input.Close();
        if (socketData.Connected)
        {
            socketData.Close();
        }
        if (!(iReplyCode == 226 || iReplyCode == 250))
        {
            ReadReply();
            if (!(iReplyCode == 226 || iReplyCode == 250))
            {
                throw new IOException(strReply.Substring(4));
            }
        }
    }

    /// <summary>
    /// 断点上传
    /// </summary>
    /// <param name="strRemoteFileName">要上传的文件名</param>
    /// <param name="strFolder">本地目录(不得以结束)</param>
    /// <param name="strLocalFileName">保存在本地时的文件名</param>
    public void PutBrokenFile(string strRemoteFileName, string strFolder, string strLocalFileName, long size)
    {
        if (!bConnected)
        {
            Connect();
        }
        SetTransferType(TransferType.Binary);

        Socket socketData = CreateDataSocket();
        SendCommand("APPE " + Path.GetFileName(strLocalFileName));
        long localsize = new FileInfo(strLocalFileName).Length;
        if (!(iReplyCode == 125 || iReplyCode == 150))
        {
            throw new IOException(strReply.Substring(4));
        }
        FileStream input = new
        FileStream(strLocalFileName, FileMode.Open);
        int iBytes = 0;
        input.Seek(size, SeekOrigin.Current);
        long current = size;
        while ((iBytes = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            current += iBytes;
            socketData.Send(buffer, iBytes, 0);
            keepProgress(current, localsize);
        }
        input.Close();
        if (socketData.Connected)
        {
            socketData.Close();
        }
        if (!(iReplyCode == 226 || iReplyCode == 250))
        {
            ReadReply();
            if (!(iReplyCode == 226 || iReplyCode == 250))
            {
                throw new IOException(strReply.Substring(4));
            }
        }
    }

解决方案五:

已经解决了,socket非正常关闭。数据就会丢失,正常关闭,数据就能保存。那么问题又来了,如果传输过程中网络中断。socket非正常关闭。那么之前的数据怎么保存?

时间: 2024-10-21 15:44:39

winfromFTP大文件上传问题。急!的相关文章

大文件上传研究

上传 这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,另外还有思归在它的博客堂中所说的办法 http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx 两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEnt

关于大文件上传的FTP解决方案

解决|上传     用asp.net上传文件时,对大文件的处理总会不尽于人意,虽然从理论上讲,可以传输很大的文件(100M以上),但在实际使用中会出现各种问题.因此,基于B/S架构的大文件上传还是用FTP为好. 用FTP手工上传文件没有什么可以说的,但我们往往需要通过程序来控制这一过程,即通过asp.net来实现这一目的.如果FTP软件具备可二次开发的接口就好了.经典的cuteftp pro就具有这样的功能. 安装完cuteftp pro 7后,会生成一个文件叫ftpte(FTP传输引擎),ft

php实现大文件上传源代码

  经典php实现大文件上传源代码: 一个比较经典的php大文件上传源代码,可成功运行. function function_upload($name,$newname="",$dir="upload")  {   global $_FILES,$ext;   $return="";   $time=time();   $upload=trim($_FILES[$name]['tmp_name']);   $upload_name=trim($_

关于大文件上传下载~~

问题描述 struts一般大文件上传都是通过form 直接获得文件 可是文件太大的话会撑爆内存 有没有什么办法可以一边获得文件流一边写入到磁盘呢? 至于文件下载最方便的方法是采用超链接的方式 可是由于某些特殊情况 会采用返回文件流的形式,返回文件流又可不可以一点一点的返回 防止内存溢出呢? 解决方案 上传用common-upload的话不是会有磁盘缓存的,不会全部都在内存里的

java web项目 大文件上传

问题描述 项目中需要上传大文件(视频),考虑到性能因素,决定选择使用ftp工具上传,服务器用的是vsftp(linux).在网上找了好多资料,决定选用uploadify+struts2(因为框架使用的是SSI)实现.ftp选用的是apache提供的客户端工具.目前遇到的问题是ftp客户端与服务器建立连接时间过长(大概需要20秒左右),前端需要长时间等待.也可以给提供解决问题的思路. 解决方案 本帖最后由 wuwei19871020 于 2015-01-07 12:11:42 编辑解决方案二:用过

asp.net下大文件上传知识整理_实用技巧

最近做在做ePartner项目,涉及到文件上传的问题. 以前也做过文件上传,但都是些小文件,不超过2M. 这次要求上传100M以上的东西. 没办法找来资料研究了一下.基于WEB的文件上传可以使用FTP和HTTP两种协议,用FTP的话虽然传输稳定,但安全性是个严重的问题,而且FTP服务器读用户库获取权限,这样对于用户使用来说还是不太方便. 剩下只有HTTP.在HTTP中有3种方式,PUT.WEBDAV.RFC1867,前2种方法不适合大文件上传,目前我们使用的web上传都是基于RFC1867标准的

PHP文件上传问题汇总(文件大小检测、大文件上传处理)_php技巧

由于涉及到本地和服务器两方面的安全问题,所以基于input type="file"形式的页面文件上传一直处于一个很尴尬的位置.一方面,用户不希望隐私泄露,所以浏览器无法对用户在上传时选择的文件做有效的判 断.另一方面,为了服务器端的安全,减轻传输负担,系统又希望能在用户开始上传之前就将非法的文件拒之门外. 一来一去,基于原始input方式的上传,成为网络存储网站避之唯恐不及的遗留性问题,也造就了现在千奇百怪的插件.上传客户端. input方式的上传就如此之差么?当然不是.上传文件不大的

Java实现FTP批量大文件上传下载篇1_java

本文介绍了在Java中,如何使用Java现有的可用的库来编写FTP客户端代码,并开发成Applet控件,做成基于Web的批量.大文件的上传下载控件.文章在比较了一系列FTP客户库的基础上,就其中一个比较通用且功能较强的j-ftp类库,对一些比较常见的功能如进度条.断点续传.内外网的映射.在Applet中回调JavaScript函数等问题进行详细的阐述及代码实现,希望通过此文起到一个抛砖引玉的作用. 一.引子 笔者在实施一个项目过程中出现了一种基于Web的文件上传下载需求.在全省(或全国)各地的用

java 大文件上传

问题描述 最近需要做一个资源平台,基于web形式,需要上传大文件,格式很多种,主要是文件都比较大(500M以上的).类似电影,应用软件.我使用的是struts2+spring+hibernate技术,先前使用的是struts2的文件上传fileUpload,重新设置上传大小,可以实现大文件上传,但是速度较慢,担心网络不好的地方,会出错误,也曾想过给每个用户开一个ftp,让他们每个人先上传自己的资源,而后在需要上传资源的地方,书写自己文件的名称,我后台去查找,验证资源是否上传了,已上传就保存,未找