2012-04-26 2 views
12

Я создаю простой перетащить файл-и-загрузки-автоматически-на-FTP приложений окнаЗагрузка файлов на FTP повреждены один раз в пункт назначения

enter image description here

и я использую MSDN code к загрузите файл на FTP.

код довольно прямо вперед:

// Get the object used to communicate with the server. 
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(String.Format("{0}{1}", FTP_PATH, filenameToUpload)); 
request.Method = WebRequestMethods.Ftp.UploadFile; 

// Options 
request.UseBinary = true; 
request.UsePassive = false; 

// FTP Credentials 
request.Credentials = new NetworkCredential(FTP_USR, FTP_PWD); 

// Copy the contents of the file to the request stream. 
StreamReader sourceStream = new StreamReader(fileToUpload.FullName); 
byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd()); 
sourceStream.Close(); 
request.ContentLength = fileContents.Length; 

Stream requestStream = request.GetRequestStream(); 
requestStream.Write(fileContents, 0, fileContents.Length); 
requestStream.Close(); 

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
writeOutput("Upload File Complete!"); 
writeOutput("Status: " + response.StatusDescription); 

response.Close(); 

и он делает получить загружены на FTP

enter image description here

Проблема является, когда я вижу файл в браузере, или просто загрузите и попытайтесь увидеть его на рабочем столе, я получаю:

enter image description here

Я уже использовал request.UseBinary = false; и request.UsePassive = false;, но это не шов, чтобы делать какие-либо добрые дела.

То, что я узнал, что исходный файл имеет 122Кб длину и в FTP (и после загрузки), он имеет 219Kb ...

Что я делаю неправильно?

Кстати, метод uploadFileToFTP() работает внутри BackgroundWorker, но я на самом деле не вещь, которая делает никакой разницы ...

+0

двоичных данных и UTF-8 не хорошо перемешать. – dtb

+0

@dtb с использованием 'Encoding.ASCII.GetBytes (sourceStream.ReadToEnd());' получает такое же поведение ... – balexandre

+0

Sigh. ** Двоичные ** данные и ** характер ** - это две разные вещи. Да, вы можете кодировать символы в байты, но вы не можете вслепую декодировать байты, которые не кодируют символы. – dtb

ответ

31

Вы не должны использовать StreamReader, но только поток для чтения двоичных файлов.

Streamreader предназначен для чтения текстовых файлов.

Try с этим:

private static void up(string sourceFile, string targetFile) 
{    
    try 
    { 
     string ftpServerIP = ConfigurationManager.AppSettings["ftpIP"]; 
     string ftpUserID = ConfigurationManager.AppSettings["ftpUser"]; 
     string ftpPassword = ConfigurationManager.AppSettings["ftpPass"]; 
     ////string ftpURI = ""; 
     string filename = "ftp://" + ftpServerIP + "//" + targetFile; 
     FtpWebRequest ftpReq = (FtpWebRequest)WebRequest.Create(filename); 
     ftpReq.UseBinary = true; 
     ftpReq.Method = WebRequestMethods.Ftp.UploadFile; 
     ftpReq.Credentials = new NetworkCredential(ftpUserID, ftpPassword); 

     byte[] b = File.ReadAllBytes(sourceFile); 

     ftpReq.ContentLength = b.Length; 
     using (Stream s = ftpReq.GetRequestStream()) 
     { 
      s.Write(b, 0, b.Length); 
     } 

     FtpWebResponse ftpResp = (FtpWebResponse)ftpReq.GetResponse(); 

     if (ftpResp != null) 
     { 
      MessageBox.Show(ftpResp.StatusDescription); 
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.ToString()); 
    } 
} 
+0

Этот человек работал. Благодаря! –

+1

@ user2212907: если это вам помогло, верните ответ, чтобы он помог другим;) – LaGrandMere

+0

Извините! Я забыл увеличить: P Сделано! –

3

Проблемы вызваны кода декодирования двоичных данных в символ данных и обратно к двоичным данным. Не делай этого.


Используйте UploadFile Method из WebClient Class:

using (WebClient client = new WebClient()) 
{ 
    client.Credentials = new NetworkCredential(FTP_USR, FTP_PWD); 
    client.UploadFile(FTP_PATH + filenameToUpload, filenameToUpload); 
} 
+1

Этот класс плохой. Выбрасывает исключения, такие как ад. Не удалось выполнить загрузку. –

+0

Вы спасли мою жизнь брату, почему люди используют этот досадный код, этот самый лучший +1 –

Смежные вопросы