2011-12-15 8 views
7

tengo que cargar un archivo a través de FTP a ftp://ftp.remoteServer.comC# URI absoluto elimina ".." de URL

Mi directorio raíz de remoteServer contiene una 'carga' y una carpeta de 'descarga'. Necesito poner mi archivo en el directorio "cargar". Pero al iniciar sesión, el servidor me coloca automáticamente en la carpeta de "descarga".

He intentado hacer esto:

string serverTarget = "ftp://ftp.remoteServer.com/"; 
serverTarget += "../upload/myfile.txt"; 
Uri target = new Uri(serverTarget); 
FTPWebRequest ftp = (FTPWebRequest)FtpWebRequest.Create(target); 

using(Stream requestStream = ftp.GetRequestStream()) { 
    // Do upload here 
} 

Este código de error con: (550) Archivo no disponible (por ejemplo, archivo no encontrado, sin acceso) I depurado el código y target.AbsoluteUri regresa como ftp://ftp.remoteServer.com/upload en lugar de ftp://ftp.remoteServer.com/../upload (falta el ..)

Si puse ftp://ftp.remoteServer.com/../upload en un navegador, puedo iniciar sesión y verificar que este es el lugar correcto donde quiero poner mi archivo.

¿Cómo puedo obtener FTPWebRequest para ir al lugar correcto?

+0

¿Usted intentó @ "en lugar de normal" de las expresiones. – ApolloSoftware

+0

literal literal cadena ... – ApolloSoftware

+1

@LostInCode Básicamente, usted está preguntando por qué ftp://ftp.remoteServer.com/../upload/myfile.txt se muestra como ftp://ftp.remoteServer.com/upload/ myfile.txt? Supongo que/upload ya está en la raíz de su sitio y que ../upload se considera redundante. –

Respuesta

2

Creo que puede codificar los puntos como% 2E para mantener los puntos en su URI.

Así que algo como:

string serverTarget = "ftp://ftp.remoteServer.com/%2E%2E/upload/myfile.txt"; 
+0

¡Eso hizo el truco! Una vez que sé qué buscar, incluso encontré una entrada SO anterior en este: http://stackoverflow.com/questions/480619/why-doesnt-ftpwebrequest-or-webrequest-in-general-accept-a-path –

+0

Para FTP, cada parte de Uri puede construirse utilizando Uri.EscapeDataString (fileOrFolderName) permitiendo todo el carácter no compatible con Uri (espacios, unicode ...): –

+0

Por ejemplo, para permitir cualquier carácter en nombre de archivo, use: req = (FtpWebRequest) WebRequest.Create (nuevo Uri (ruta + "/" + Uri.EscapeDataString (nombre de archivo))); –

1

Prueba esto: comentario

string serverTarget = "../upload/myfile.txt"; 
Uri uri = new Uri(serverTarget, UriKind.Relative); 
1

Andy Evans es correcta.

Considera la URI: http://ftp.myserver.com/../. El .. significa, "llévame al padre de este directorio". Pero allí es ¡sin padre! Entonces, cuando obtenga la URL absoluta, terminará con http://ftp.myserver.com/. No hay nada más que el analizador pueda hacer.

Creo que el problema es con la configuración de su servidor FTP. Asumo que la estructura de directorios se ve algo como:

ftproot 
    upload 
    download 

Parece que el servicio FTP está iniciando la sesión automáticamente a /ftproot/download. Es decir, el URI ftp.myserver.com se correlaciona con /ftproot/download en el sistema de archivos local. Si ese es el caso, ninguna cantidad de manipulación con el URI lo llevará a ninguna parte. Si la raíz de URI está asignada al directorio de descarga, no hay forma de que pueda, usando la sintaxis .., "subir un nivel y luego bajar".

¿Puede cargar utilizando un cliente FTP como Filezilla, o quizás la herramienta de línea de comandos FTP de Windows? Si es así, ¿cuáles son los pasos que debe seguir para hacerlo? ¿Puedes hacer que tu código haga lo mismo?

Cuestiones relacionadas