当前位置: 首页 > 知识库问答 >
问题:

使用ftp上载文件

南宫龙野
2023-03-14

我正在IIS服务器上使用网站面板。我想使用ftp上载文件

我使用了以下代码:

try
{
     WebClient webClient = new WebClient();

     OpenFileDialog fd = new OpenFileDialog();
     fd.ShowDialog();

     MessageBox.Show(fd.FileName);

     webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);

 }
 catch (Exception ex)
 { 
     MessageBox.Show(ex.Message);
 }

这段代码运行没有错误。当我使用网站面板的文件管理器时,一个文件创建了“Name.ext”,但这个文件大小是0 KB。为什么?我有什么问题?!

我确信windows防火墙允许我这么做。

更新:我正在使用UploadFileTask和UploadFile(unasync)进行操作,但结果与async相同:(

共有3个答案

公良鸿禧
2023-03-14

我建议使用本机FtpWebRequest类上载文件。

     try
     {
        OpenFileDialog fd = new OpenFileDialog();
        fd.ShowDialog();
        MessageBox.Show(fd.FileName);

        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://address/" + fd.FileName);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential("username", "pass");
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = false;

        FileStream stream = File.OpenRead(fd.FileName);
        byte[] buffer = new byte[stream.Length];

        stream.Read(buffer, 0, buffer.Length);
        stream.Close();

        Stream reqStream = request.GetRequestStream();
        reqStream.Write(buffer, 0, buffer.Length);
        reqStream.Close();
       }
    catch (Exception ex)
    { MessageBox.Show(ex.Message);


    }
微生昌胤
2023-03-14

我的第一个想法是,您没有等待Async调用,因此运行此代码的任何进程或线程都可能在UploadFileTaskAsync调用实际完成之前结束。

尝试将Try块的最后一个调用更改为

await webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);

您可能还想检查调用的返回值:

var result = await webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);

结果对象是来自服务器的响应的字节[]。

齐迪
2023-03-14

您的异常可能会在从WebClient返回的未等待的任务中被吞入。UploadFileTaskAsync。您应该在您的任务上等待,这样您的catch块将检测到潜在的异常,因为它将引发等待的代码行:

public async Task UploadFileByFtpAsync()
{
   try
   {
       WebClient webClient = new WebClient();

       OpenFileDialog fd = new OpenFileDialog();
       fd.ShowDialog();

       MessageBox.Show(fd.FileName);

       Task<byte[]> response = await webClient.UploadFileTaskAsync(new Uri("ftp://" + "username" + ":" +"pass" +"@" + "address/" + "name.ext"), fd.FileName);

       // You might want to validate the response status code is valid here
    }
    catch (Exception ex)
    { 
        MessageBox.Show(ex.Message);
        // Do useful exception handling here
    }
}

编辑

正如我在评论中所说,检查response变量,它包含您的上载尝试的响应,该响应可能已失败。

编辑2

问题似乎与web/ftp请求的KeepAlive属性有关。底层连接已关闭中有一个公认的答案:服务器违反了协议。FTP和此处

 类似资料:
  • 我尝试使用C#将文件上传到FTP服务器。文件已上传,但字节为零。

  • 在FTP服务器上有一些文件。此服务器上的任何时间都在上传新文件。我想下载最后一个文件。如何从此服务器获取上次上传的文件?所有文件都具有不同的名称。 我使用以下脚本下载了一个文件。 提前感谢!!!

  • 我们需要一个能够存储大量大型csv文件(1000个文件,每天每个1GB)的系统。 还有一些客户端应该连接到此系统并下载csv文件 系统应该容错和可扩展... 我考虑使用Hadoop集群并在其上运行FTP服务器。。。 Hadoop适合这个项目吗? 如果没有,什么技术是合适的?

  • 我想将文件从一台服务器上传到另一台FTP服务器,以下是我的上传文件代码,但它抛出错误为: 远程服务器返回错误:(550)文件不可用(例如,找不到文件,无法访问)。 这是我的代码: 你能告诉我哪里出了问题吗?

  • 本文向大家介绍php使用curl实现ftp文件下载功能,包括了php使用curl实现ftp文件下载功能的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了php实现ftp文件下载功能,供大家参考,具体内容如下 不知道为什么用正常的ftp_get函数下载文件速度特别慢,但是用ftp的客户端下载很快,所以换了curl的下载方式,速度正常 测试下载小文件是正常的,但是如果网速很慢,下载大文件时