2011-08-07 2 views
0

EDIT : 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(); 
} 

?

+1

관련이 없지만 실제로 스트림을 '사용'블록으로 감싸서 제대로 폐기해야합니다. –

답변

2

편집 : 여기에 다음 진단 단계는 아래의 답변이 도움이하지 않는 것 (하지만 더 나은 코드를 같이 내가 후손을 위해 거기를 떠날거야)로서 나는 확인 것 :

  • 파일을 어떻게 보십니까? 가능하다면 웹 브라우저 등을 통해 파일을 다시 가져 오는 대신 서버에 직접 도달하십시오.
  • 연결할 FTP 서버의 종류는 무엇입니까? 어쩌면 알려진 문제가있을 수 있습니다.
  • Wireshark을 통해 실제로 전송 된 내용을 보았습니까?
  • 일반 FTP 클라이언트를 통해 동일한 파일을 보내 봤습니까?

당신은 정확한 파일 내용을 보존하기 위해 true로 FtpWebRequest.UseBinary을 설정해야합니다. 그렇지 않으면 두 시스템은 라인 종단을 스스로 알아 내려고 라인 종단을 적절하게 변경합니다. 나는 거의 생각하지 않는 것이 좋은 생각입니다. (EDIT가 : UseBinary 실제로 기본적으로 true이지만,이 텍스트 모드를 사용하여 도입 문제의 종류 같은 소리 ... 그것은 확실히 전혀 해를 끼치이 명시 적으로 만드는 없습니다 않습니다.) 또한

:

  • 당신은 using 문을 통해 FileStream 폐기해야 당신은 당신은 결과의 메모를 복용해야
  • 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()) 
    { 
    } 
} 
+0

그 생각은 내가 생각한 첫 번째 것이었지만 문서에서 기본 값이 이미 사실임을 알았다. –

+0

@ 조 : 흠 ... 네 말이 맞아. 나는 그것을 개인적으로 True로 명시 적으로 설정하여 차이가 있는지 확인합니다. OP의 코드에 충분한 다른 문제가있어 답변에 표시된 새 버전을 사용하고 결과를 확인하는 것이 좋습니다. 물론 OP의 FTP 서버가 고장 났을 가능성이 있습니다 ... –

+0

@Jon Skeet : 코드를 사용했지만 문제가 지속됩니다. 또한 고쳐 주셔서 감사합니다! – Anatoly

1

당신이 보내는 시스템은 시스템이 사용하는 것과 다른 라인 엔딩을 사용합니다. 나는 당신이 여분의 라인을 얻었 기 때문에 윈도우에 있고 CRLF 엔딩을 사용한다고 가정 할 수있다. 전송하려는 시스템이 CR 및 LF를 별도의 결말로 인식하므로 여분의 회선이 생깁니다.

텍스트의 경우 LF 또는 CR을 자르면 어떤 일이 발생하는지 확인하십시오. 다른 파일 크기에 대한 단서가 없습니다.

+0

(또는 바이너리 모드를 사용하십시오. 사용자 환경 설정 :)) –

2

이상한. 나는 똑같은 문제에 직면 해 있으며 파일에 확장 기능을 제공하지 않으면 문제를 해결할 수 없었다. 예를 들어 내 파일 이름은 내가 abcfile.dat을하고 그 후 나에게 실제 파일로 업로드 된 파일을 보여줍니다

abcfile

을했다합니다. 다시 abcfile.txt 파일을 업로드하지만 이번에는 업로드 된 파일에 빈 줄 문제가 다시 나타납니다.

.txt를 제외한 파일 확장명을 제공해야합니다.

관련 문제