2016-11-15 22 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転送でなければなりません。そうしないとあなたが最後のラウンドであまりにも多くのバイトを書き

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

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を使用する必要があります。

関連する問題