none
cargar un archivo en otra carpeta que no sea la de mi aplicacion RRS feed

  • Pregunta

  • Hola, tengo una aplicación que me graba un archivo mediante un fileupload c# asp 2010, si me graba y todo pero en forma local o en la dirección del proyecto, lo que yo quiero es grabar en otra dirección ejemplo 192.168.0.10/fotos. pero me dice que no es la carpeta raiz.

    Me pueden ayudar con esto por favor, adjunto el código que tengo:

    if (this.filSubirArchivo.HasFile)
                {
                    //si hay una archivo.
                    string nombreArchivo = this.filSubirArchivo.FileName;
                    string ruta = "d:/Fotos/" + nombreArchivo;
                    this.filSubirArchivo.SaveAs(Server.MapPath(ruta));

                    this.lblRutaArchivo.Text = "Se guardó la imagen. y su ruta es" + Environment.NewLine + ruta;
                }

    Muchas gracias


    diego

    viernes, 3 de agosto de 2018 21:41

Respuestas

  • Veo un error aquí:

    this.filSubirArchivo.SaveAs(Server.MapPath(ruta));

    Fíjate que en tu código "ruta" ya es una ruta en disco (empieza por "d:...", solo que tienes mal las barras, has puesto "/" en lugar de "\"). No es una ruta virtual de las de http. Por lo tanto, no tiene sentido llamar al Server.MapPath, que sirve para traducir la ruta http a la ruta de disco, en tu caso no hay que traducir nada. Es decir, el código quedaría así:

    string ruta = "d:\\Fotos\\" + nombreArchivo;
    this.filSubirArchivo.SaveAs(ruta);

    Recuerda que cuando pongas esto en producción seguramente será necesario asignar los permisos adecuados en la carpeta de destino, ya que de forma predeterminada y mientras no lo cambies, la aplicación web en producción no tiene permiso para grabar nada por fuera de la carpeta en la que se ha instalado.

    Por cierto, el mensaje que das después en el Label NO deberías darlo. Se considera un riesgo de seguridad el dar información al usuario sobre las rutas internas del servidor web. El usuario no tiene por qué conocer que tu servidor tiene un disco "D:", y mucho menos los nombres de las carpetas dentro de dicho disco. Esto es irrelevante para el usuario de la web, que nunca puede ver ni acceder a dichas carpetas.

    sábado, 4 de agosto de 2018 6:23
  • hola

    Por defecto el sitio web solo tiene permisos de escritura dentro de la carpeta del propio sitio, por eso se usa

    string ruta = Server.MapPath("~/Fotos");

    asi tienes la ruta fisica de una carpeta dentro del sitio web

    Si quieres grabar por fuera vas a tener que definir permisos especiales de acceso usando para esto el usuario con el cual ejecuta el Application Pool del sitio o sino impersonando

    Suplantación de ASP.NET

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 5 de agosto de 2018 16:51

Todas las respuestas

  • Veo un error aquí:

    this.filSubirArchivo.SaveAs(Server.MapPath(ruta));

    Fíjate que en tu código "ruta" ya es una ruta en disco (empieza por "d:...", solo que tienes mal las barras, has puesto "/" en lugar de "\"). No es una ruta virtual de las de http. Por lo tanto, no tiene sentido llamar al Server.MapPath, que sirve para traducir la ruta http a la ruta de disco, en tu caso no hay que traducir nada. Es decir, el código quedaría así:

    string ruta = "d:\\Fotos\\" + nombreArchivo;
    this.filSubirArchivo.SaveAs(ruta);

    Recuerda que cuando pongas esto en producción seguramente será necesario asignar los permisos adecuados en la carpeta de destino, ya que de forma predeterminada y mientras no lo cambies, la aplicación web en producción no tiene permiso para grabar nada por fuera de la carpeta en la que se ha instalado.

    Por cierto, el mensaje que das después en el Label NO deberías darlo. Se considera un riesgo de seguridad el dar información al usuario sobre las rutas internas del servidor web. El usuario no tiene por qué conocer que tu servidor tiene un disco "D:", y mucho menos los nombres de las carpetas dentro de dicho disco. Esto es irrelevante para el usuario de la web, que nunca puede ver ni acceder a dichas carpetas.

    sábado, 4 de agosto de 2018 6:23
  • hola

    Por defecto el sitio web solo tiene permisos de escritura dentro de la carpeta del propio sitio, por eso se usa

    string ruta = Server.MapPath("~/Fotos");

    asi tienes la ruta fisica de una carpeta dentro del sitio web

    Si quieres grabar por fuera vas a tener que definir permisos especiales de acceso usando para esto el usuario con el cual ejecuta el Application Pool del sitio o sino impersonando

    Suplantación de ASP.NET

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 5 de agosto de 2018 16:51
  • Muchas gracias por tu ayuda y por responder, si, la verdad si me graba pero solo en forma local, pero al momento de publicar quiero que me grabe en el servidor (cualquier dirección física c:, d:, etc) desde un cliente no lo hace solo local y si pongo alguna dirección que no es del sitio web me sale error.

    Gracias


    diego

    lunes, 6 de agosto de 2018 22:29
  • Sí, por la forma en que lo describes es efectivamente como yo te decía, es decir, en producción no puedes grabar en cualquier sitio del servidor porque no tienes los permisos adecuados. Asegúrate de usar para el Pool de aplicaciones una cuenta que tenga permisos NTFS en todas las ubicaciones en las que quieras grabar. Y también que el sitio web no esté configurado para rodar con permisos de CAS reducidos. Esto no es un problema si el servidor es tuyo, pero si has publicado en un hosting compartido, casi con toda seguridad no te lo consentirán.

    Por cierto, donde dices "quiero que me grabe en el servidor (cualquier dirección física c:, d:, etc)" asegúrate de que filtras correctamente dichas ubicaciones físicas y no consientes que el usuario las elija; de lo contrario supone un gravísimo riesgo de seguridad para tu servidor web.

    martes, 7 de agosto de 2018 7:30