Crear carpetas y guardar archivos con asp.net
-
Monday, November 08, 2010 4:17 PM
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
All Replies
-
Monday, November 08, 2010 4:28 PMModerator
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 -
Monday, November 08, 2010 4:35 PMVoy 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 -
Monday, November 08, 2010 4:42 PMModerator
hola
como puedo crearla??
podrias usar
Directory. CreateDirectory(path)
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Monday, November 08, 2010 4:50 PM
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 -
Monday, November 08, 2010 5:09 PMModerator
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 -
Monday, November 08, 2010 5:22 PM
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- Edited by Joy Montero Monday, November 08, 2010 5:23 PM error de dedo
-
Monday, November 08, 2010 5:32 PMModerator
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 -
Monday, November 08, 2010 5:47 PM
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 -
Monday, November 08, 2010 5:54 PMModerator
hola
pero no tienes que suar el Server.MapPath() si suas una ruta fisica
lo suas directo
saludos
Leandro Tuttini
Blog
Buenos Aires
Argentina -
Monday, November 08, 2010 6:12 PM
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 -
Monday, November 08, 2010 6:32 PM
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 -
Monday, November 08, 2010 6:51 PMModerator
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 -
Monday, November 08, 2010 7:17 PM
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 -
Monday, November 08, 2010 8:36 PMModerator
-
Monday, November 08, 2010 10:40 PM
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 -
Tuesday, November 09, 2010 12:05 PMModerator
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 -
Tuesday, November 09, 2010 4:34 PM
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 -
Tuesday, November 09, 2010 4:47 PMModerator
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
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- Marked As Answer by Eduardo PorteschellerMicrosoft Community Contributor, Moderator Wednesday, November 17, 2010 1:41 PM
-
Tuesday, November 09, 2010 5:31 PMEntonces 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 -
Wednesday, November 10, 2010 12:43 PMOwnerHola
¿ Has podido solucionar tu problema ?
Saludos
Eduardo Portescheller

