【问题标题】:Get File Size from FTP (in SSIS, using Dts.Connections)从 FTP 获取文件大小(在 SSIS 中,使用 Dts.Connections)
【发布时间】:2017-05-05 18:39:03
【问题描述】:

我在将大文件发送到 FTP 站点时遇到问题,我想在传输后检查文件大小(有时它可以工作,有时它会失败)。传输在 SSIS 内,我在 C# 中使用 Dts.Connections。

我的代码:

public long TransferFile(string file)
{
    long filesize = 0L;

    try
    {
        string[] newfile = new[] { file };

        ConnectionManager ftpCM = Dts.Connections["ftp_server"];
        string remoteDir = Dts.Variables["FtpWorkingDirectory"].Value.ToString();

        FtpClientConnection ftpClient = new FtpClientConnection(ftpCM.AcquireConnection(null));
        ftpClient.UsePassiveMode = true;
        ftpClient.Connect();
        ftpClient.Retries = 10;
        ftpClient.SetWorkingDirectory(remoteDir);

        ftpClient.SendFiles(newfile, remoteDir, true, false);

        ftpClient.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return filesize;
}

我找到了使用 FtpWebRequest 的示例,但我没有可用的 ftp uri,所以我不知道如何使用此方法。我怎样才能得到这个文件大小?

更新: 添加这个:

        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpCM.ConnectionString + remoteDir + "/" + file));
        request.Proxy = null;

        DtsProperty ServerUsername = ftpCM.Properties["ServerUserName"];
        DtsProperty ServerPassword = ftpCM.Properties["ServerPassword"];
        request.Credentials = new NetworkCredential(ServerUsername.GetValue(ftpCM).ToString(), ServerPassword.GetValue(ftpCM).ToString());
        request.Method = WebRequestMethods.Ftp.GetFileSize;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        filesize = response.ContentLength;
        response.Close();

我收到错误:属性 ServerPassword 是只写的。

【问题讨论】:

  • ftpCM 应该是 uri。
  • “我没有可用的 ftp uri” - 你是什么意思? URL 只是另一种提供 FTP 连接所需的连接信息的格式! - 如ftp://username:password@hostname 甚至ftp://hostname,如果您通过request.Credentials = new NetworkCredential(...) 单独提供用户名/密码。
  • 你从哪里得到“属性 ServerPassword 是只写的。”? - 正是!

标签: c# ssis ftp ssis-2012


【解决方案1】:

最终的解决方案是将用户名和密码存储在变量中而不是连接参数中。

并使用以下代码:

public long TransferFile(string file)
{
    long filesize = 0L;

    try
    {
        string[] newfile = new[] { file };

        ConnectionManager ftpCM = Dts.Connections["ftp_server"];
        string remoteDir = Dts.Variables["FtpWorkingDirectory"].Value.ToString();
        string ServerUsername = Dts.Variables["ServerUsername"].Value.ToString();
        string ServerPassword = Dts.Variables["ServerPassword"].Value.ToString();

        FtpClientConnection ftpClient = new FtpClientConnection(ftpCM.AcquireConnection(null));
        ftpClient.UsePassiveMode = true;
        ftpClient.ServerUserName = ServerUsername;
        ftpClient.ServerPassword = ServerPassword;

        ftpClient.Connect();
        ftpClient.Retries = 10;
        ftpClient.SetWorkingDirectory(remoteDir);

        ftpClient.SendFiles(newfile, remoteDir, true, false);

        ftpClient.Close();

        FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + ftpCM.ConnectionString + remoteDir + "/" + Path.GetFileName(file)));
        request.Proxy = null;

        request.Credentials = new NetworkCredential(ServerUsername, ServerPassword);
        request.Method = WebRequestMethods.Ftp.GetFileSize;

        FtpWebResponse response = (FtpWebResponse)request.GetResponse();
        filesize = response.ContentLength;
        response.Close();
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return filesize;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多