2012-04-26 14 views
12

Estoy creando un simple arrastrar-y-archivo-carga automáticamente a FTP uso de las ventanasCarga de archivos a FTP están dañados una vez en destino

enter image description here

y estoy usando el MSDN code a carga el archivo al FTP.

El código es bastante sencillo:

// 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(); 

y lo hace conseguir cargado en el FTP

enter image description here

El problema es cuando veo el archivo en un navegador, o simplemente descargue y trate de verlo en el escritorio obtengo:

enter image description here

ya que utiliza request.UseBinary = false; y request.UsePassive = false; pero no de costura para hacer cualquier tipo de buena que sea.

Lo que he descubierto fue eso, el archivo original tiene 122Kb longitud y en el FTP (y después de la descarga), que tiene 219Kb ...

¿Qué estoy haciendo mal?

Por cierto, el método uploadFileToFTP() se ejecuta dentro de un BackgroundWorker, pero que realmente no lo que hace que cualquier diferencia ...

+0

datos binarios y UTF-8 no se mezcla bien. – dtb

+0

@dtb usando 'Encoding.ASCII.GetBytes (sourceStream.ReadToEnd());' obtiene el mismo comportamiento ... – balexandre

+0

Suspiro. ** Datos binarios ** y ** caracteres ** son dos cosas diferentes. Sí, puede codificar caracteres en bytes, pero no puede decodificar ciegamente los bytes que no codifican caracteres. – dtb

Respuesta

31

No use un StreamReader pero sólo una cadena para leer archivos binarios.

Streamreader está diseñado para leer solo archivos de texto.

intento con esto:

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

Ese funcionó. ¡Gracias! –

+1

@ user2212907: si te ayudó, respaldó la respuesta para que ayude a los demás;) – LaGrandMere

+0

¡Lo siento! Me olvidé de votar: P ¡Listo! –

3

Los problemas son causados ​​por el código de la decodificación de los datos binarios en caracteres datos y de vuelta a datos binarios. No hagas esto


Uso del UploadFile Method del WebClient Class:

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

Esa clase es mala. Lanza excepciones como el infierno. No se ha podido realizar la carga. –

+0

Has salvado a mi hermano de la vida, por qué las personas usan ese código molesto, este es el mejor +1 –

Cuestiones relacionadas