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

おかしいです。同じ問題に直面し、ファイルに拡張子を指定しない限り修正できませんでした。たとえば、私のファイル名が

abcfile

次に、それをabcfile.datにします。その後、アップロードされたファイルが実際のファイルとして表示されます。もう一度abcfile.txtでファイルをアップロードしましたが、今回もアップロードしたファイルに空の行の問題が表示されます。

.txt以外のファイルに拡張子を付ける必要があることをお勧めします。

于 2012-04-19T07:12:32.010 に答える
2

編集:以下の答えは役に立たないようです(ただし、より良いコードを示しているため、後世のために残しています)、次の診断手順を確認します。

  • ファイルをどのように表示していますか?可能であれば、Web ブラウザーなどを介してファイルを再度取得するのではなく、サーバーに直接アクセスしてください。
  • 接続している FTP サーバーの種類は何ですか? 既知の問題がある可能性があります。
  • 実際にWireshark経由で送信されているものを調べてみましたか?
  • 通常の FTP クライアント経由で同じファイルを送信しようとしましたか?

FtpWebRequest.UseBinary正確なファイルの内容を保持するには、true に設定する必要があります。そうしないと、2 つのシステムが自分で行末を見つけようとし、適切と思われる行末記号を変更します。それがいいと思うことはほとんどありません。(編集: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 に答える
1

送信先のシステムは、システムが使用しているものとは異なる行末を使用しています。余分な行があるため、Windows を使用していて、CRLF エンディングを使用していると推測できます。送信先のシステムは CR と LF を別のエンディングとして認識するため、余分な行が表示されます。

テキストについては、LF または CR を切り捨て、何が起こるかを確認します。ファイルサイズの違いについてはわかりません。

于 2011-08-07T18:20:26.073 に答える