2016-05-10 51 views
0

ASP.NETでFTPモードを使用してPDFファイルをアップロードしようとしていますが、ファイルのアップロードは成功しましたが、結果ファイルが破損しています。FTPアップロードされたファイルが壊れています

public void UploadFTPTextFile(string ftpServer, string ftpFolder, string user, string passward, string NName, FileUpload FileUpload1) 
{ 
    byte[] fileBytes = null; 
    string fileName = NName; 
    using (StreamReader fileStream = new StreamReader(FileUpload1.PostedFile.InputStream)) 
    { 
     fileBytes = Encoding.UTF8.GetBytes(fileStream.ReadToEnd()); 
     fileStream.Close(); 
    } 
    //Create FTP Request. 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + ftpFolder + fileName); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 

    request.Credentials = new NetworkCredential(user, passward); 
    request.ContentLength = fileBytes.Length; 
    request.UsePassive = true; 
    request.UseBinary = true; 
    request.ServicePoint.ConnectionLimit = fileBytes.Length; 
    request.EnableSsl = false; 

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

私は解決策を教えてください、ありがとう –

+1

私はあなたの問題を理解することができますように形式を改善し、エラーを述べてくださいあなたは得ます – AJ93

+0

ファイルがUTF-8として間違いなくエンコードされていますか?最初にファイルシステムの新しいファイルにファイルを書き出し、その2つの間のバイトを比較してみてください。それらが同一であれば、アップロードをやりなおしてください。 – ManoDestra

答えて

1

入力ファイルをバイトに読み込むのが問題だと思います。あなたはUTF8エンコーディングであると仮定しますが、FTPはテキストを解釈せず、エンコーディングは必要ありません。 FTPサーバーはバイトを保存するだけなので、バイトを読み取る必要があります。代わりにFile.ReadAllBytesを使用してください。

public void UploadFTPTextFile(string ftpServer, string ftpFolder, string user, string passward, string NName, FileUpload FileUpload1) 
{ 
    string fileName = NName; 
    byte[] fileBytes = File.ReadAllBytes(fileName); 

    //Create FTP Request. 
    FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ftpServer + ftpFolder + fileName); 
    request.Method = WebRequestMethods.Ftp.UploadFile; 

    request.Credentials = new NetworkCredential(user, passward); 
    request.ContentLength = fileBytes.Length; 
    request.UsePassive = true; 
    request.UseBinary = true; 
    request.ServicePoint.ConnectionLimit = fileBytes.Length; 
    request.EnableSsl = false; 

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

あなたは、(巨大なファイルの場合)でも、よりエレガントなソリューションを使用Stream.CopyToを使用してfileBytesを使用せずにrequestStreamに開かれたファイルをコピーしたい場合。

関連する問題