none
Crear carpetas y guardar archivos con asp.net

    Pregunta

  • Hola, verán estoy haciendo una página la cuál me pueda crear una carpeta (por el momento que sea dentro de mi Pc.. luego lo modifico para q sea dentro de un servidor) y luego dentro de esa carpeta guardar un archivo.. Alguien me puede decir como hacer esto??? Es que nunca he hecho algo parecido.. me podrian ayudar con páginas o algo de codigo?? Me encontré un ejemplo.. pero no tengo idea de donde modificar el path.. es el siguiente:

     if (file_upload.PostedFile != null)
            {
                try
                {
                   
                    string workingDirectory =  ("archivos/" + ped + "/");
                    string successmsg = goodmessage("Se subió el archivo con éxito. (<a href=\"Default.aspx?ped=" + Server.UrlEncode(ped) + "\">Regresar</a>)");

                    HttpPostedFile myFile = file_upload.PostedFile;
                    string savePath = workingDirectory + ddl_docs.SelectedValue + "/" + Path.GetFileName(myFile.FileName);

                    int file_length = myFile.ContentLength;

                    if (file_length == 0)
                    {
                        errormsg.Text += errormessage("Error: No se especificó ningún archivo, o el archivo especificado no contiene datos.");
                    }

                    else
                    {

                        if (Directory.Exists(savePath )) // File.Exists(savePath))
                        {
                            errormsg.Text += errormessage("Error: Ya existe un archivo con el mismo nombre. Por favor cambie el nombre e intente de nuevo.");
                        }

                        else
                        {
                            if (Directory.Exists(workingDirectory + ddl_docs.SelectedValue + "/"))
                            {
                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                                update_lastModified_date();
                            }

                            else
                            {
                                Directory.CreateDirectory(workingDirectory + ddl_docs.SelectedValue + "/");

                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                                update_lastModified_date();
                            }
                        }
                    }
                }

                catch (Exception ex)
                {
                    errormsg.Text += errormessage("Error: " + ex);
                }
            }

     

    si me pueden ayudar, los agradecería mucho.. Saludos!


    Joy Montero
    lunes, 08 de noviembre de 2010 16:17

Respuestas

  • hola

    necesito subir mi aplicación en un servidor y pues q me crear carpetas y guardar archivos en otro servidor

    si vas a crear archivos en otro servidor no uses el Server.MapPath este solo sirve si quieres saber la ruta fisica basado en el nombre de una carpeta que esta bajo la estructura del sitio

    si el path esta por fuera de la estructura, o en otro equipo el Server.MapPath no sirve

    para acceder al otro servidor usa directo

    \\NombreoIPdelaPC\NombreCarpetaCompartira

    por ejmeplo \\192.168.1.2\SharedFolder

    eso lo usas directo para armar la ruta dodne quieres grabar

     

    igual aqui hay un tema, y son los permiso, para que funcione seguramente tengas que impersonar el sitio, para esto debes configurar el web.config

     

    ASP.NET Impersonation

    C ó mo implementar la representación en una aplicación ASP.NET

    Understanding Impersonation in ASP.NET

    basicamente defines un usuario con el cual sera ejeuctado el sitio

    en el web.config degines el tag

    <identity impersonate="true"
              userName="domain\user"
              password="password" />

    y alli pones un usuario que sabes tienes acceso a la carpeta que ahs compartido y quieres escribir

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 09 de noviembre de 2010 16:47

Todas las respuestas

  • hola

    algo raro que note es esta linea

    string workingDirectory =  ("archivos/" + ped + "/");

    alli no estas definiendo una ruta fisica donde guardar la imagen, falta algo como ser c:\innetpub\wwwroot\nombresitio\archivos

    para obtener esto podrias usar

    string workingDirectory = Path.Combine(Server.MapPath("archivos"), ped);

    con esto obtienes la primer parte de la ruta, recuersda que "archivos" deberia ser una carpeta que este dentro del sitio, para que Server.MapPath() pueda resolverla

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 16:28
  • Voy a ponerlo en práctica.. lo que me dices.. pero antes de guardar los archivos.. necesito crear la carpeta.. como puedo crearla?? Es que es parte de eso jeje.. que antes de guardar lo archivos tengo que crear la carpeta.. como puedo hacerlo??? Suponiendo que seria otro boton. gracias por la atención.!
    Joy Montero
    lunes, 08 de noviembre de 2010 16:35
  • hola

    como puedo crearla??

    podrias usar

    Directory. CreateDirectory(path)

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 16:42
  • Ok.. aorita checo eso.. al probar poniendo así mas o menos como me dijiste al principio.. me muestra este error:

    Error: System.ArgumentException: Format of the initialization string does not conform to specification starting at index 0. at System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) at System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey) at System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules) at System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) at System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) at System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(String connectionString, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) at System.Data.SqlClient.SqlConnection.ConnectionString_Set(String value) at System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) at System.Data.SqlClient.SqlConnection..ctor(String connectionString) at editdocs.update_lastModified_date() in c:\Users\humberto\Documents\Visual Studio 2008\WebSites\WebSite3\editdocs.aspx.cs:line 264 at editdocs.Button1_Click(Object sender, EventArgs e) in c:\Users\humberto\Documents\Visual Studio 2008\WebSites\WebSite3\editdocs.aspx.cs:line 247

     

    El codigo que estoy probando es el siguiente:

     protected void Button1_Click(object sender, EventArgs e)
        {
            string ped = Request.QueryString["ped"];

            if (file_upload.PostedFile != null)
            {
                try
                {
                    string nn1 = "";
                    switch (Session["aduana"].ToString())//(ddladuana.SelectedValue) //DropDownList1.SelectedValue)
                    {
                      
                        case "270": nn1 = "C:/Prueba/"; break;
                        case "271": nn1 = "C:/Prueba1/"; break;
                        case "520": nn1 = "C:/Prueba2/"; break;
                        case "800": nn1 = "C:/Prueba3/"; break;
                        case "240": nn1 = "C:/Prueba4/"; break;
                    }
                   
                    common_conn = nn1;
                    string workingDirectory = Path.Combine(Server.MapPath("Prueba"), ped);
                    //string workingDirectory = common_conn + "/" + Session["aduana"].ToString() + ped;
                    string successmsg = goodmessage("Se subió el archivo con éxito. (<a href=\"Default.aspx?ped=" + Server.UrlEncode(ped) + "\">Regresar</a>)");

                    HttpPostedFile myFile = file_upload.PostedFile;
                    string savePath = workingDirectory + ddl_docs.SelectedValue + "/" + Path.GetFileName(myFile.FileName);

                    int file_length = myFile.ContentLength;

                    if (file_length == 0)
                    {
                        errormsg.Text += errormessage("Error: No se especificó ningún archivo, o el archivo especificado no contiene datos.");
                    }

                    else
                    {

                        if  (File.Exists(savePath))
                        {
                            errormsg.Text += errormessage("Error: Ya existe un archivo con el mismo nombre. Por favor cambie el nombre e intente de nuevo.");
                        }

                        else
                        {
                            if (Directory.Exists(workingDirectory + ddl_docs.SelectedValue + "/"))
                            {
                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                                update_lastModified_date();
                            }

                            else
                            {
                                Directory.CreateDirectory(workingDirectory + ddl_docs.SelectedValue + "/");

                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                                update_lastModified_date();
                            }
                        }
                    }
                }

                catch (Exception ex)
                {
                    errormsg.Text += errormessage("Error: " + ex);
                }
            }
        }

    Que puedo hacer al respecto?


    Joy Montero
    lunes, 08 de noviembre de 2010 16:50
  • hola

    pero aqui

    string savePath = workingDirectory + ddl_docs.SelectedValue + "/" + Path.GetFileName(myFile.FileName);

    como sabes que el workingDirectory termina en \, ademas no es la / la que usaas es un path fisico, no virtual

    usa el Path.Combine para unir rutas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 17:09
  • Hola.. gracias por responder.. bueno.. ahora me sale este error al hacer las modificaciones jeje..

    Error: System.Web.HttpException: 'C:/Prueba/' is not a valid virtual path. at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options) at System.Web.HttpServerUtility.MapPath(String path) at editdocs.Button1_Click(Object sender, EventArgs e) in c:\Users\humberto\Documents\Visual Studio 2008\WebSites\WebSite3\editdocs.aspx.cs:line 215

     

    donde marca el error es en esta linea:

    string workingDirectory = Path.Combine(Server.MapPath("C:/Prueba/"), Session["aduana"].ToString() + "3183" + ped);

     

    Me revolví con esto ultimo.. lo bueno es que gracias a tu consejo puede crear la carpeta.. solo falta guardar el archivo jeje..



    Joy Montero
    • Editado Joy Montero lunes, 08 de noviembre de 2010 17:23 error de dedo
    lunes, 08 de noviembre de 2010 17:22
  • hola

    en el Server.MapPath no pones el c:\

    solo el nombre de la carpeta que este dentro de la estructura del sitio web

    si suas un path por fuera el Server.MapPath, no se usa

    directamente aplcia el c:\Prueba

    y usa las barras \, peor con el @

    string path = @"c:\prueba";

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 17:32
  • Disculpa pero me sigue saliendo el mismo error:

    Error: System.Web.HttpException: 'C:\Prueba' is not a valid virtual path. at System.Web.VirtualPath.Create(String virtualPath, VirtualPathOptions options) at System.Web.HttpServerUtility.MapPath(String path) at editdocs.Button1_Click(Object sender, EventArgs e) in c:\Users\humberto\Documents\Visual Studio 2008\WebSites\WebSite3\editdocs.aspx.cs:line 215


    En la misma línea.. la del path.. que puedo hacer?? hay alguna otra forma para acomodar esto que dé el mismo resultado???


    Joy Montero
    lunes, 08 de noviembre de 2010 17:47
  • hola

    pero no tienes que suar el Server.MapPath() si suas una ruta fisica

    lo suas directo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 17:54
  • Ok..ahora lo que pase es que no me muestra ningun error.. y al parecer.. no me guarda nada pero me dice que ya se guardó.. Que podría ser ahora??

    Te pongo el codigo con las modificaciones hasta ahorita:

    protected void Button1_Click(object sender, EventArgs e)
        {
            string ped = Request.QueryString["ped"];

            if (file_upload.PostedFile != null)
            {
                try
                {
                    string nn1 = "";
                    switch (Session["aduana"].ToString())
                    {
                         case "270": nn1 = "C:/Prueba/"; break;
                        case "271": nn1 = "C:/Prueba1/"; break;
                        case "520": nn1 = "C:/Prueba2/"; break;
                        case "800": nn1 = "C:/Prueba3/"; break;
                        case "240": nn1 = "C:/Prueba4/"; break;
                    }
                   
                    common_conn = nn1;
                   
                    string workingDirectory = Path.Combine(Server.MapPath(common_conn), Session["aduana"].ToString() + "3183" + ped);
                   
                    string successmsg = goodmessage("Se subió el archivo con éxito. (<a href=\"Default.aspx?ped=" + Server.UrlEncode(ped) + "\">Regresar</a>)");

                    HttpPostedFile myFile = file_upload.PostedFile;
                    string savePath = workingDirectory + ddl_docs.SelectedValue + Path.GetFileName(myFile.FileName);

                    int file_length = myFile.ContentLength;

                    if (file_length == 0)
                    {
                        errormsg.Text += errormessage("Error: No se especificó ningún archivo, o el archivo especificado no contiene datos.");
                    }

                    else
                    {

                        if (File.Exists(savePath))
                        {
                            errormsg.Text += errormessage("Error: Ya existe un archivo con el mismo nombre. Por favor cambie el nombre e intente de nuevo.");
                        }

                        else
                        {
                            if (Directory.Exists(workingDirectory + ddl_docs.SelectedValue + "/"))
                            {
                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                            }

                            else
                            {
                                Directory.CreateDirectory(workingDirectory + ddl_docs.SelectedValue + "/");

                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                            }
                        }
                    }
                }

                catch (Exception ex)
                {
                    errormsg.Text += errormessage("Error: " + ex);
                }
            }
        }
    Gracias por la atención..


    Joy Montero
    lunes, 08 de noviembre de 2010 18:12
  • Ok..ahora lo que pase es que no me muestra ningun error.. y al parecer.. no me guarda nada pero me dice que ya se guardó.. Que podría ser ahora??

    Te pongo el codigo con las modificaciones hasta ahorita:

    protected void Button1_Click(object sender, EventArgs e)
        {
            string ped = Request.QueryString["ped"];

            if (file_upload.PostedFile != null)
            {
                try
                {
                    string nn1 = "";
                    switch (Session["aduana"].ToString())
                    {
                         case "270": nn1 = "C:/Prueba/"; break;
                        case "271": nn1 = "C:/Prueba1/"; break;
                        case "520": nn1 = "C:/Prueba2/"; break;
                        case "800": nn1 = "C:/Prueba3/"; break;
                        case "240": nn1 = "C:/Prueba4/"; break;
                    }
                   
                    common_conn = nn1;
                   
                    string workingDirectory = Path.Combine(Server.MapPath(common_conn), Session["aduana"].ToString() + "3183" + ped);
                   
                    string successmsg = goodmessage("Se subió el archivo con éxito. (<a href=\"Default.aspx?ped=" + Server.UrlEncode(ped) + "\">Regresar</a>)");

                    HttpPostedFile myFile = file_upload.PostedFile;
                    string savePath = workingDirectory + ddl_docs.SelectedValue + Path.GetFileName(myFile.FileName);

                    int file_length = myFile.ContentLength;

                    if (file_length == 0)
                    {
                        errormsg.Text += errormessage("Error: No se especificó ningún archivo, o el archivo especificado no contiene datos.");
                    }

                    else
                    {

                        if (File.Exists(savePath))
                        {
                            errormsg.Text += errormessage("Error: Ya existe un archivo con el mismo nombre. Por favor cambie el nombre e intente de nuevo.");
                        }

                        else
                        {
                            if (Directory.Exists(workingDirectory + ddl_docs.SelectedValue + "/"))
                            {
                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                            }

                            else
                            {
                                Directory.CreateDirectory(workingDirectory + ddl_docs.SelectedValue + "/");

                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                            }
                        }
                    }
                }

                catch (Exception ex)
                {
                    errormsg.Text += errormessage("Error: " + ex);
                }
            }
        }
    Gracias por la atención..


    Joy Montero

    Ok.. ya vi donde los guarda.. el problema que veo es que me los está guardando en una carpeta dentro de mi aplicación.. haz de cuenta que al revisar las carpetas en mi proyecto de visual Studio.. a la derecha.. se me creó una carpeta llamada "Prueba" y ahí es donde se me está guardando los documentos.. como puedo evitar esto???

    Joy Montero
    lunes, 08 de noviembre de 2010 18:32
  • hola

    veo que usas el

    Server.MapPath(common_conn)

    esto como comente devuelve el path fisico dentro de la estructura del sitio

    si quieres evitar no uses el Server.MapPath(), y pon la ruta fija define el part directo

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 18:51
  • Verás.. es que el common_conn me devuelve el valor de en que lugar lo voy a guardar los datos.. segun la "aduana" que elija. Así que no puedo utilizar ruta fija.. tiene que ser dinámica.

    intenté poniendo lo siguiente en el switch.. que es donde todo el path y me marca error:

    case "270": nn1 = @"C:\Prueba\" + Session["aduana"].ToString () + "3183" + ped; break;

     

    Error en el path, me dice,así que puedo hacer?? Entonces quito el Server.MapPath()???.. Agradezco tu ayuda e ideas,...

     

     


    Joy Montero
    lunes, 08 de noviembre de 2010 19:17
  • hola

    has usado en alguna oportunidad brekpoint en el codigo ?

    si es asi intenta usarlo para poder inspeccionar las variables que arman el path y validar que este sea correcto en formato

    este es un breakpoint imagen

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 08 de noviembre de 2010 20:36
  • Si estoy utilizando varios breakpoints jeje.. disculpa.. pero no se a que le moví que ya me guarda en la carpeta en mi Pc jaja... Gracias.. oie.. una ultima pregunta.. siguiendo el hilo de esto.. si quiero hacer esto mismo pero en un servidor?? En cuestión de permisos como le puedo hacer?? Poruqe intenté hacerlo pero me dice que no tengo permisos para ello..

    alguna sugerencia?? si no para dar por terminado el tema jeje..

    Aqui el codigo para el boton por sis a alguien le sirve:

     protected void Button1_Click(object sender, EventArgs e)
        {
            string ped = Request.QueryString["ped"];

            if (file_upload.PostedFile != null)
            {
                try
                {
                    string nn1 = "";
                    switch (Session["aduana"].ToString())//(ddladuana.SelectedValue) //DropDownList1.SelectedValue)
                    {
                        case "270": nn1 = "C:/Prueba/"; break;
                        case "271": nn1 = "C:/Prueba1/"; break;
                        case "520": nn1 = "C:/Prueba2/"; break;
                        case "800": nn1 = "C:/Prueba3/"; break;
                        case "240": nn1 = "C:/Prueba4/"; break;
                       
                    }
                   
                    common_conn = nn1;
                  
                    string workingDirectory = Path.Combine(common_conn, Session["aduana"].ToString() + "3183" + ped);
                  
                    string successmsg = goodmessage("Se subió el archivo con éxito. (<a href=\"Default.aspx?ped=" + Server.UrlEncode(ped) + "\">Regresar</a>)");

                    HttpPostedFile myFile = file_upload.PostedFile;
                    string savePath = workingDirectory + "/" + ddl_docs.SelectedValue + Path.GetFileName(myFile.FileName);

                    int file_length = myFile.ContentLength;

                    if (file_length == 0)
                    {
                        errormsg.Text += errormessage("Error: No se especificó ningún archivo, o el archivo especificado no contiene datos.");
                    }

                    else
                    {

                        if (File.Exists(savePath))
                        {
                            errormsg.Text += errormessage("Error: Ya existe un archivo con el mismo nombre. Por favor cambie el nombre e intente de nuevo.");
                        }

                        else
                        {
                          
                                myFile.SaveAs(savePath);
                                errormsg.Text = successmsg;
                              
                          
                        }
                    }
                }

                catch (Exception ex)
                {
                    errormsg.Text += errormessage("Error: " + ex);
                }
            }
        }


    Joy Montero
    lunes, 08 de noviembre de 2010 22:40
  • hola

    En cuestión de permisos como le puedo hacer??

    por eso el consejo inicial era que la carpeta que uses para dejar los archivos este dentro de la estructura del sitio

    si usas una carpeta dentro de la propia carpeta donde estan las apginas web no tendras problema de permisos

    si usas cualquier otra puede que los tengas, por ahi deberias darle permisos al usuario ASPNET, para que escriba alli

    al principio recomende que usaras el Server.MapPath justamente por eso porque resuleve una ruta fisica en base a un nombre de una carpeta del sitio, aunque si la conoces tambien es valida ponerla directamente

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 09 de noviembre de 2010 12:05
  • Disculpa la tardanza.. bueno.. si utilizo entonces así como dices.. para grabar el archivo también requerir;ia ponerlo así?? Es q me revolví en cuestión de esto.. es que verás necesito subir mi aplicación en un servidor y pues q me crear carpetas y guardar archivos en otro servidor.. entonces las rutas las pondría así??

    Para guardar el documento en la carpeta ubicada en un servidor:

    string workingDirectory = Server.MapPath(common_conn, Session["aduana"].ToString() + "3183" + ped + "/");

    (Cabe destacar que cuando lo pongo así me marca el siguiente error: No overload for method 'MapPath' takes '2' arguments)

    Aparte como lo pondria para la crear la carpeta?? Osea, tengo este que digo:

    Directory.CreateDirectory(nn + "/" + anio + "/" + Session["aduana"].ToString() + "3183" + ped);

    Siendo la variable nn la direccion donde ser crearía la carpeta.. se supone que es la direccion completa

    entonces como pondría utilizar aqui el Server.MapPath?? Si se supone que estoy utilizando la dirección directa donde quiero que se cree la carpeta.. por que me dice que no tengo los permisos???

    Gracias por tu atención!


    Joy Montero
    martes, 09 de noviembre de 2010 16:34
  • hola

    necesito subir mi aplicación en un servidor y pues q me crear carpetas y guardar archivos en otro servidor

    si vas a crear archivos en otro servidor no uses el Server.MapPath este solo sirve si quieres saber la ruta fisica basado en el nombre de una carpeta que esta bajo la estructura del sitio

    si el path esta por fuera de la estructura, o en otro equipo el Server.MapPath no sirve

    para acceder al otro servidor usa directo

    \\NombreoIPdelaPC\NombreCarpetaCompartira

    por ejmeplo \\192.168.1.2\SharedFolder

    eso lo usas directo para armar la ruta dodne quieres grabar

     

    igual aqui hay un tema, y son los permiso, para que funcione seguramente tengas que impersonar el sitio, para esto debes configurar el web.config

     

    ASP.NET Impersonation

    C ó mo implementar la representación en una aplicación ASP.NET

    Understanding Impersonation in ASP.NET

    basicamente defines un usuario con el cual sera ejeuctado el sitio

    en el web.config degines el tag

    <identity impersonate="true"
              userName="domain\user"
              password="password" />

    y alli pones un usuario que sabes tienes acceso a la carpeta que ahs compartido y quieres escribir

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 09 de noviembre de 2010 16:47
  • Entonces si le pongo un login-logout para que vea los permisos de c/usuario crees que resolvería esto?? O es mejor así como dices??
    Joy Montero
    martes, 09 de noviembre de 2010 17:31
  • Hola

    ¿ Has podido solucionar tu problema ?

    Saludos

    Eduardo Portescheller
    miércoles, 10 de noviembre de 2010 12:43