0

编辑: Filezilla 引起了这个问题,当我从服务器下载文件时,它添加了新行。我很抱歉造成混乱。


此方法将文件上传到 ftp 服务器,它工作正常,但在上传到服务器的文本文件中,每行后都会出现空行(“cr lf”出现),例如:

File: 
First line
Second line
Third line

Uploaded file:
First line

Second line

Third line

源文件和上传文件相应地具有不同的大小,非文本文件是相同的。

代码:

private void sendFile(string In, string Out)
{   
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create("ftp://domain//" + Out);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential("username", "password");             

    FileStream sourceStream = new FileStream(In, FileMode.Open, FileAccess.Read, FileShare.Read);
    byte[] fileContents = new byte[sourceStream.Length];
    sourceStream.Read(fileContents, 0, (int) sourceStream.Length);
    sorceStream.Close();

    request.ContentLength = fileContents.Length;
    Stream requestStream = request.GetRequestStream();
    requestStream.Write(fileContents, 0, fileContents.Length);

    requestStream.Close();
}

我怎样才能解决这个问题?

4

5 回答 5

2

编辑:由于下面的答案似乎没有帮助(但我将它留在那里以供后代使用,因为它显示了更好的代码)这里是我要检查的下一个诊断步骤:

  • 您如何查看文件?如果可能的话,直接进入服务器,而不是通过网络浏览器或其他方式再次获取文件。
  • 您要连接的 FTP 服务器的类型是什么?也许有一个已知问题。
  • 您是否尝试过查看通过Wireshark实际发送的内容?
  • 您是否尝试过通过普通的 FTP 客户端发送相同的文件?

您应该设置FtpWebRequest.UseBinary为 true 以保留确切的文件内容。否则,这两个系统将尝试自行找出行尾,并根据需要更改行终止符。我很少认为这是个好主意。(编辑:UseBinary实际上true是默认设置,但这听起来像是使用文本模式引入的那种问题......明确表示这一点当然没有害处。)

此外:

  • 您应该FileStream通过using声明处理您的
  • 您应该通过using语句处理请求流
  • 您应该注意结果Stream.Read- 它不需要总是一次性读取整个请求的数据
  • 您可以使用File.ReadAllBytes简单地一次性读取完整的文件数据,或者使用Stream.CopyTo(如果您使用的是 .NET 4)将其复制FileStream到请求流(当然,它不会设置内容长度;我没有不知道这是否有问题)
  • 你从不打电话GetResponse;如果您从不获取FtpWebRequest
  • 您的参数名称与 .NET 命名约定不匹配,并且描述性不强

所以我可能会使用:

private void SendFile(string inputFile, string outputPath)
{   
    FtpWebRequest request = (FtpWebRequest) WebRequest.Create
        ("ftp://domain//" + outputPath);
    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.UseBinary = true;
    request.Credentials = new NetworkCredential("username", "password");

    byte[] fileContents = File.ReadAllBytes(inputFile);
    request.ContentLength = fileContents.Length;

    using (Stream requestStream = request.GetRequestStream())
    {
        requestStream.Write(fileContents, 0, fileContents.Length);
    }

    // This *may* be necessary in order to validate that everything has happened
    using (WebResponse response = request.GetResponse())
    {
    }
}
于 2011-08-07T18:20:22.860 回答
2

真奇怪。我面临同样的问题,直到我没有在文件中提供扩展名之前我无法修复它。例如,如果我的文件名是

abc文件

然后我将其设为 abcfile.dat,然后将上传的文件显示为实际文件。我再次使用 abcfile.txt 上传文件,但这一次我上传的文件中再次出现空行问题。

我建议您必须为您的文件提供除 .txt 之外的任何扩展名。

于 2012-04-19T07:12:32.010 回答
1

您发送到的系统使用与您的系统使用的不同的行尾。我可以假设,因为你得到一个额外的行,你在 Windows 上,它使用 CRLF 结尾。您发送到的系统将 CR 和 LF 识别为单独的结尾,因此您会得到额外的行。

对于文本,截断 LF 或 CR,看看会发生什么。我不知道不同的文件大小。

于 2011-08-07T18:20:26.073 回答
0

在 FileZilla 的顶部菜单中,设置:

Transfer menu > Transfer type > binary
于 2021-02-16T23:33:59.373 回答
0

在 FileZilla 的顶部菜单中,设置:

Transfer menu > Transfer type > binary

它对我有用。

于 2021-12-03T04:43:29.153 回答