2016-11-15 2 views
-1

.NET 3.5를 사용 중이며 일부 파일을 FTP로 전송해야합니다. MemoryStreambytes arrays을 사용하여 모두 관리하기 때문에 파일을 사용하고 싶지 않습니다.C# FtpWebRequest가 손상된 파일을 만듭니다.

이 기사 (articlearticle)를 읽은 후 제 고객을 만들었습니다.

public void Upload(byte[] fileBytes, string remoteFile) 
{ 
    try 
    { 
     string uri = string.Format("{0}:{1}/{2}", Hostname, Port, remoteFile); 
     FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(uri); 
     ftp.Credentials = new NetworkCredential(Username.Normalize(), Password.Normalize()); 

     ftp.UseBinary = true; 
     ftp.UsePassive = true; 
     ftp.Method = WebRequestMethods.Ftp.UploadFile; 

     using (Stream localFileStream = new MemoryStream(fileBytes)) 
     { 
      using (Stream ftpStream = ftp.GetRequestStream()) 
      { 
       int bufferSize = (int)Math.Min(localFileStream.Length, 2048); 
       byte[] buffer = new byte[bufferSize]; 
       int bytesSent = -1; 

       while (bytesSent != 0) 
       { 
        bytesSent = localFileStream.Read(buffer, 0, bufferSize); 
        ftpStream.Write(buffer, 0, bufferSize); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     LogHelper.WriteLog(logs, "Errore Upload", ex); 
     throw; 
    } 
} 

FTP 클라이언트는 오류없이 올바르게 연결, 쓰기 및 닫기합니다. 그러나 PDF 파일을 열 수 없으며 DOC/DOCX Word의 경우 파일 손상에 대한 메시지를 표시하고 파일을 복원하려고 시도하는 등 서면 파일이 손상되었습니다.

Upload 메소드에 전달 된 동일한 바이트를 파일에 쓰면 올바른 파일을 얻습니다. 따라서 문제는 FTP 전송으로 발생해야합니다.

byte[] fileBytes = memoryStream.ToArray(); 
File.WriteAllBytes(@"C:\test.pdf", fileBytes); // --> File OK! 
ftpClient.Upload(fileBytes, remoteFile); // --> File CORRUPTED on FTP folder! 
+1

파일이 정확히 같은 길이로 도착합니까? 조금이라도 일찍 자르면 어떨까요? – BugFinder

답변

2

당신은 Write 호출에 bytesSent를 사용해야합니다 :

bytesSent = localFileStream.Read(buffer, 0, bufferSize); 
ftpStream.Write(buffer, 0, bytesSent); 

그렇지 않으면 마지막 라운드에서 너무 많은 바이트를 작성합니다.

관련 문제