Introducción
Este articulo podría considerarse la continuación de:
[ASP.NET] - Guardar Imagen base de datos
básicamente se extenderá el articulo anterior aportando los temas:
- subir un archivo a una carpeta dentro del sitio
- validación de las extensiones que puede subirse
- listar los archivos de la carpeta
- distintas formas de representar el link de descarga
- link directo al archivo
- link a una pagina que administrara la descarga
- borrado del archivo de la carpeta del sitio
- subir el archivos a una base de datos
- listar los registro de la tabla
- distintas formas de implementar la descarga
- usando un handler
- usando una página que administre la descarga
- eliminar registro de la base de datos, por ende el archivo
Subir un archivo a una carpeta del sitio
Para esta primera sección se trabajara con el contenido desarrollado en la carpeta “GuardarEnCarpeta” del proyecto que se puede descargar en el articulo, la carpeta contiene la página “ListarArchivos.aspx”, cuya funcionalidad será la de subir (FileUpload) y además listas los archivos (GridView), de una carpeta determinada dentro de la estructura del sitio web.
<form id="form1" runat="server"> <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <br /> <br /> <asp:Button ID="btnSubirArchivo" runat="server" Text="Subir Archivo" onclick="btnSubirArchivo_Click" /> <br /> <asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Solo pdf, doc o xls son permitidos." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+(.pdf|.doc|xls)$" ControlToValidate="FileUpload1"> </asp:RegularExpressionValidator> <br /> <br /> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" onrowdeleting="GridView1_RowDeleting" DataKeyNames="Name"> <RowStyle BackColor="#EFF3FB" /> <Columns> <asp:TemplateField HeaderText="Eliminar" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:ImageButton ID="imgEliminar" runat="server" CommandName="Delete" ImageUrl="~/imagenes/delete.png" Width="24px" Height="24px"/> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Nombre Archivo"> <ItemTemplate> <asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Name", "~/files/{0}") %>' Text='<%# Eval("Name") %>'> </asp:HyperLink> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Length" HeaderText="Tamaño" /> <asp:TemplateField HeaderText="Descargar" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:HyperLink ID="descarga" runat="server" NavigateUrl='<%# Eval("Name", "~/GuardarEnCarpeta/Download.aspx?filename={0}") %>'> <img src="../imagenes/download.gif" alt="" width="30px" height="30px" style="border-width:0px;" /> </asp:HyperLink> </ItemTemplate> </asp:TemplateField> </Columns> <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <EditRowStyle BackColor="#2461BF" /> <AlternatingRowStyle BackColor="White" /> </asp:GridView> </div> </form>
Es importante resaltar algunos puntos de este código.
Validación en las extensión que pueden ser subidas al sitio
Se hace uso del control RegularExpressionValidator, para proporcionar una validación del lado del cliente, que impida subir archivos en una extensión invalida, o no deseada.
<asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Solo pdf, doc o xls son permitidos." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+(.pdf|.doc|xls)$" ControlToValidate="FileUpload1"> </asp:RegularExpressionValidator>
Dos formas diferentes de exponer el link de descarga
El gridview que lista los archivos de la carpeta expone dos link de descarga del archivo listado, uno de ellos al presionar el nombre:
<asp:TemplateField HeaderText="Nombre Archivo"> <ItemTemplate> <asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Name", "~/files/{0}") %>' Text='<%# Eval("Name") %>'> </asp:HyperLink> </ItemTemplate> </asp:TemplateField>
Prestar atención a la definición del NavidateUrl, en este la url especifica concretamente al archivo, por medio del path relativo usando el ~/, esto se puede lograr porque al archivo esta físicamente alojado en una carpeta en al estructura del sitio publicado.
La otra alternativa se presenta al presionar sobre la imagen de descarga:
<asp:TemplateField HeaderText="Descargar" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:HyperLink ID="descarga" runat="server" NavigateUrl='<%# Eval("Name", "~/GuardarEnCarpeta/Download.aspx?filename={0}") %>'> <img src="../imagenes/download.gif" alt="" width="30px" height="30px" style="border-width:0px;" /> </asp:HyperLink> </ItemTemplate> </asp:TemplateField>
En este otro caso se define una pagina web “Download.aspx” con un valor que pasara por querystring, esta pagina será la responsable de tomar el archivo desde su lugar físico y lo enviara en el Response.
Es importante en este punto analizar que acciones toma esta pagina.
public partial class Download : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { string filename = Request.QueryString["filename"].ToString(); Response.Clear(); Response.AddHeader("content-disposition", string.Format("attachment;filename={0}", filename)); Response.ContentType = "application/octet-stream"; Response.WriteFile(Server.MapPath(Path.Combine("~/files", filename))); Response.End(); } }
El código que implementa es muy simple, solo toma el archivo que recibe por la url, define información para la respuesta y escribe en el Response el archivo para ser enviado.
Un punto no menor es la definición del ContentType del tipo “application/octet-stream”, este forzara la descarga mostrando el cuadro de download al usuario para que seleccione donde quiere descargarlo. Si en lugar de usar este se hubiera definido el tipo concreto para carda archivo, al realizarse la descarga se mostraría embebido el documento en el browser, por supuesto esto sucederá si el usuario posee un editor para este documento.
Eliminación del archivo subido el sitio
La eliminación del archivo esta implementada en los botones de gridview, pero para esto funcione se definen varios puntos, el primero tiene que ver con la columna en el grid
<asp:TemplateField HeaderText="Eliminar" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:ImageButton ID="imgEliminar" runat="server" CommandName="Delete" ImageUrl="~/imagenes/delete.png" Width="24px" Height="24px"/> </ItemTemplate> </asp:TemplateField>
la cual es un ImagenButton con el CommandName = “Delete”, que lleve el nombre “Delete” no es arbitrario, sino que con este nombre lanzara el evento RowDeleting del gridview, es por eso que se asocia el evento onrowdeleting="GridView1_RowDeleting" además de las propiedad DataKeyNames="Name", para poder tomar el nombre del archivo que se quiere eliminar.
Si ahora se analiza el evento:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { //se obtiene el nombre de campo definido en el DataKeyNames del gridview string fileName = Convert.ToString(GridView1.DataKeys[e.RowIndex].Value); //se define el path fisico del archivo string fullPath = Path.Combine(Server.MapPath("~/files"), fileName); File.Delete(fullPath); Response.Redirect("ListarArchivos.aspx"); }
en este se hace uso del DataKeys, para obtener el nombre del archivo, esto se logra gracias al DataKeyNames definido con el campo del nombre del archivo, ahora solo queda obtener la ruta física y proceder a eliminar.
Subir un archivo a la base de datos
En esta otra sección cambiaremos de carpeta del trabajo dentro del sitio, ahora sera “GuardarEnDb”, aquí también se cuenta con un GridView para listar los archivos registrados en la db, y el FileUpload para subirlos al sitio.
<form id="form1" runat="server"> <div> <asp:FileUpload ID="FileUpload1" runat="server" /> <br /> <br /> <asp:Button ID="btnGuardar" runat="server" Text="Guardar Archivo" OnClick="btnGuardar_Click" /> <br /> <asp:RegularExpressionValidator id="RegularExpressionValidator1" runat="server" ErrorMessage="Solo pdf, doc o xls son permitidos." ValidationExpression="^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+(.pdf|.doc|xls)$" ControlToValidate="FileUpload1"> </asp:RegularExpressionValidator> <br /> <br /> <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="4" ForeColor="#333333" GridLines="None" DataKeyNames="Id" onrowdeleting="GridView1_RowDeleting"> <RowStyle BackColor="#EFF3FB" /> <Columns> <asp:TemplateField HeaderText="Eliminar" ItemStyle-HorizontalAlign="Center"> <ItemTemplate> <asp:ImageButton ID="imgEliminar" runat="server" CommandName="Delete" ImageUrl="~/imagenes/delete.png" Width="24px" Height="24px"/> </ItemTemplate> </asp:TemplateField> <asp:TemplateField HeaderText="Nombre Archivo"> <ItemTemplate> <asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Id", "~/DescargaArchivo.ashx?id={0}") %>' Text='<%# Eval("Nombre") %>'> </asp:HyperLink> </ItemTemplate> </asp:TemplateField> <asp:BoundField DataField="Length" HeaderText="Tamaño" /> <asp:TemplateField HeaderText="Descargar"> <ItemTemplate> <asp:HyperLink ID="descarga" runat="server" NavigateUrl='<%# Eval("Id", "~/GuardarEnDb/Download.aspx?id={0}") %>'> <img src="../imagenes/download.gif" alt="" width="30px" height="30px" style="border-width:0px;" /> </asp:HyperLink> </ItemTemplate> </asp:TemplateField> </Columns> <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" /> <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" /> <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" /> <EditRowStyle BackColor="#2461BF" /> <AlternatingRowStyle BackColor="White" /> </asp:GridView> </div> </form>
A simple vista pareciera idéntico al ejemplo tratado en el punto 2 del articulo, pero hay detalles que deben analizarse, porque hay unas cuantas diferencias.
Dos formas diferentes de exponer el link de descarga
Aquí también nos encontramos con distintas formas de descarga, pero en este caso al tratarse de una base de datos ya no se puede acceder directo al archivo por su url, será necesario contar con intermediarios que obtengan el archivo desde la db y lo envíen como respuesta.
Una de esta formas se define por medio de un handler, en donde la columna en el grid poseerá una url al mismo.
<asp:TemplateField HeaderText="Nombre Archivo"> <ItemTemplate> <asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Id", "~/DescargaArchivo.ashx?id={0}") %>' Text='<%# Eval("Nombre") %>'> </asp:HyperLink> </ItemTemplate> </asp:TemplateField>
Nótese que lo importante aquí no es el nombre que se use para referirse al handler, ya que este puede ser cualquiera, lo importante es la extensión usada (en este caso ashx), ya que la misma será definida en el web.config, en la línea:
<httpHandlers> . . <add verb="*" path="*.ashx" type="GuardarArchivoBaseDatos.GuardarArchivo.HttpImageHandler"/> </httpHandlers>
La implementación del handler se encuentra en la clase HttpImageHandler.cs, dentro del código del mismo se simula el comportamiento que tendría la definición del link si se lo define directo al archivo, es por eso que se define un ContentType concreto para cada extensión especifica de los archivos soportados.
public class HttpImageHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { int id = Convert.ToInt32(context.Request.Params["id"]); Archivo archivo = ArchivosDAL.GetById(id); context.Response.Clear(); context.Response.AddHeader("content-disposition", string.Format("attachment;filename={0}", archivo.Nombre)); switch (Path.GetExtension(archivo.Nombre).ToLower()) { case ".pdf": context.Response.ContentType = "application/pdf"; break; case ".doc": context.Response.ContentType = "application/msword"; break; case ".xls": context.Response.ContentType = "application/vnd.ms-excel"; break; } context.Response.BinaryWrite(archivo.ContenidoArchivo); context.Response.End(); } public bool IsReusable { get { return false; } } }
Nota: podrías haberse definido directamente el “application/octet-stream” en el hadler, pero se realizo de esta forma para mostrar distintas variantes que pueden aplicarse.
Es en la otra alternativa se define la página “Download.aspx”, pero esta tiene algunas diferencias con respeto a su semejante cuando se trabaja con archivos.
<asp:TemplateField HeaderText="Descargar"> <ItemTemplate> <asp:HyperLink ID="descarga" runat="server" NavigateUrl='<%# Eval("Id", "~/GuardarEnDb/Download.aspx?id={0}") %>'> <img src="../imagenes/download.gif" alt="" width="30px" height="30px" style="border-width:0px;" /> </asp:HyperLink> </ItemTemplate> </asp:TemplateField>
Si bien pareciera engañar la igualdad con el ejemplo del punto 2.2, este tiene sus diferencias, una muy clara es el uso del campo “Id” como parámetro de la url del link, al usar una base de datos estamos trabajando con registro y los mismo se identifican por su clave.
public partial class Download : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { int id = Convert.ToInt32(Request.QueryString["id"]); Archivo archivo = ArchivosDAL.GetById(id); Response.Clear(); Response.AddHeader("content-disposition", string.Format("attachment;filename={0}", archivo.Nombre)); Response.ContentType = "application/octet-stream"; Response.BinaryWrite(archivo.ContenidoArchivo); Response.End(); } }
Se toma el id enviado en el querystring, se recupera la información del archivo por medio de una consulta a la DB y luego de definir el ContentType, se envía el array de byte por el Response, nótese que aquí no se escribe un archivo porque no se tiene uno, sino que se opera directamente con los byte.
Eliminación del archivo subido el sitio
Las diferencia en este punto con lo visto en el 2.3, es que aquí se debe hacer uso del id de la entidad que se quiere eliminar, y no el nombre del archivo, es por eso que se define el DataKeyNames, con el “Id”, y luego en el código:
protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e) { //se obtiene el nombre de campo definido en el DataKeyNames del gridview int id = Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Value); ArchivosDAL.DeleteById(id); CargarListadImagenes(); }
se toma este para ejecuta la consulta de DELETE del registro en la db
Código de ejemplo
El desarrollo del ejemplo fue realizado con Visual Studio 2008, y la db empleada es Sql Server 2008 Express, el mdf de la misma se encuentra en la carpeta App_Data, y la cadena de conexión se define en el Web.config
[C#] |
[VB.NET] |
Hola Leo!
ResponderEliminarTe tengo una consultita...
tu siempre haces lo siguiente:
Convert.ToInt32(txtBusqueda.Text)
mi consulta es, cual es la diferencia con eso y hacer lo siguiente:?
CInt(txtBusqueda.Text) ???
Gracias!!!
Algo mas...
ResponderEliminarcual es la diferencia entre usar esto
Private _idEmpleado As Nullable(Of Integer) = Nothing
que es lo que tu haces x lo general.
a utilizar lo siguiente:
Private _idEmpleado As Integer
hola ×LiZzY MeNdiViL×
ResponderEliminarEl tema es que CInt() es una funcion exclusiva de VB.NET, si solo prograsmas en este lenguaje esta perfecto es bueno usarla.
Pero si programas como yo lo hago en ambos lenguajes (C# y VB.NET) ya no puede usar CInt() para convertir de tipo, debes ir a la funcionalidad estandar de .net, por eso el Convert.ToInt32()
saludos
hola
ResponderEliminaral usar Nullable(Of Integer) estas declaran un tipo nulo.
Tipos de valor que puede que no tengan un valor definido
al definir una variable con un tipo nulo haces que este no tenga un valor determinado, en cambio al declarar un integer aunque no asignes nada este tendra un valor por defecto, por ahi un cero, pero es un valor en si que por ahi en la logica del programa afecta las condiciones aplicadas.
Es mas los valores nulos tiens metodos como ser HasValue() quen puede ayudar para determinar si se asigno un valor a la variable.
saludos
Hola Leandro, una consulta, ¿cual sería el tamaño máximo que podría tener el archivo al guardarlo en la base de datos. Gracias.
ResponderEliminarque pena, y otra pregunta,
ResponderEliminarProbando y haciendo debug, cuando trato de subir un archivo mayor a 4MB me aparece la odiosa página azul <>... ¿por que puede ser?
hola fealso84
ResponderEliminarhasta donde se no hay un limite establecido para los archivos, es mas si lo llegas a encontrar, revisa este link
FILESTREAM Storage in SQL Server 2008
veras que de esta forma es mas performante mantener odcumentos en la db.
Con respecto al error, puede que se deba a que estes con el limite del upload d elos archivos, esto se cambia por configuracion
Limiting the File Upload Size in ASP.NET
como veras hay un limite por defecto de 4Mb que puedes ampliar
saludos
UFFF.... Leandro... eres grande... muchas gracias!!!!
ResponderEliminarHola Leandro, una pregunta en este post has usado algo propio del sql 2008 que me impida usar el sql2005, sino es así me podrías hacer un favor porfa? podrías subir el script de la BD como haz venido haciendo en tus posts mas recientes??
ResponderEliminarGracias
hola Alexandra
ResponderEliminarHe actualizado el articulo, poniendo el zip de la db
veras que es algo grande para un script, pero recuerda que este tiene archivos de ejemplos.
Hola Leandro, tengo una duda, en el ProcessRequest cuando haces el case para obtener los datos del archivo (extensión), al context.Response.ContentType le indicas el tipo de archivo. ¿como hago para saber que asignar, para cada tipo de archivo, por ejemplo, si es un ZIP, un Rar, un txt.. que valor debo asignar al contenttype = Application/xxx o como los puedo inferir. Y ahora, en el regular expression como le agrego más extensiones de archivos. Gracias.
ResponderEliminarhola fealso84
ResponderEliminarbien, partamos de la base que lo conveniente seria limitar a un grupo conocido de tipos de archivos con los cules piensas trabajar, subir absolutamente cualquier cosa no creo que sea bueno
Para conocer que debes poner en el ContentType, solo debes ver que Mime type corresponde a la extension
Mime Types
Para el tema de la validacion de en la expresion regular, solo defines mas extensiones
^(([a-zA-Z]:)|(\\{2}\w+)\$?)(\\(\w[\w].*))+(.pdf|.doc|xls|txt|zip|rar)$
es por eso que comente que seria bueno limitar un poco, sino esta lista se puede volver larga
Nota: lo que no recuerdas es si debia ir con . o sin este en el expresion regular, pero puede probar de usar .txt o solo txt
saludos
Que tal Leandro,
ResponderEliminarEn primer lugar quisiera agradecer tu magnifico post. Estoy empezando a programar en .net y la verdad es que me es de mucha utilidad. Sin embargo, no consigo hacer funcionar tu ejemplo dentro de mi aplicacion. Siempre me da error en el web.config, en la linea en la que configuramos el handler "No se pudo cargar el tipo 'GuardarArchivoBaseDatos.GuardarArchivo.HttpImageHandler'.". Como te he dicho antes, estoy empezando en el mundo de .net y me hago un poco de lio con los namespace, creo que por ahi puede venir el problema. ¿Crees que podrias echarme una mano?.
Un saludo,
Miguel.
Ya lo solucioné, tan solo tenia que dejar la linea asi:
ResponderEliminarGracias!
hola Miguel
ResponderEliminarBueno me alegro que sea util el articulo y hayas posido solucionar el problema
saludos
Hola Leandro
ResponderEliminarTengo un problemilla al tratar de usar configSection para sacar la cadena de conexion del app.config o web.config, me tira el siguiente error: "Error de inicializacion del sistema de configuracion". Estoy usando c# 2010. los archivos se llaman app.config y connectionStrings.config.
A continuacion, los relaciono:
app.config:
y el connectionStrings.config:
Los 2 archivos estan en el directorio de la solucion. ¿Es posible que el connectionStrings.config este en cualquier ruta del servidor?
En lo que me pueda ayudar, le agradezco mucho
Saludos desde Medellin, Colombia
Andres Mauricio
hola Mauro
ResponderEliminarestas aplicando algo como esto
Tip: Put Connection Strings in Their Own Configuration File
si es asi imagino que mientras indiques el path correcto a ese otro archivo podria estar en otra carpeta, pero deberias indicar el path completo
saludos
Hola Leandro!
ResponderEliminarCorrecto, eso es lo que estoy haciendo. Ya me funciona sin problema si tengo los 2 archivos .config dentro de la carpeta de la solucion, el tema es que quiero que el archivo que se llama connectionStrings.config este fuera del directorio de solucion, por ejemplo en la ruta c:\windows\system32 (es a manera de ejemplo). La cuestion es que me arroja el siguiente error: "Error en la inicializacion del sistema de configuracion". Es como si no fuera capaz de llegar hasta esa ruta. Mi percepcion del tema, sin ser experto, es que si la seccion configSource solo puede usarse para llamar archivos de configuracion dentro de la carpeta de una solucion, eso seria un poco limitado para una herramienta tan poderosa como VSNET, aunque lo mas probable es que este haciendo algo mal y no he podido dar con la solucion.
hola Mauro
ResponderEliminarHas intentado poner el connectionStrings.config en otra carpeta distinta, no junto al config, pero si en otra carpeta cercana
lo planteo porque quizas es un tema de seguridad al querer acceder, la verdad nunca he intentado separarlo para ponerlo en system32, mas que nada porque me suena un lugar raro para ponder un archivo de configuracion
saludos
Hola Leandro!
ResponderEliminarSi efectivamente probe ubicando en distintos lugares el archivo connectionStrings.config pero no va....
Lo de system32 fue solo por mencionar algun directorio pero no quiere decir que lo vaya a ubicar alli...
Estoy que me rindo con configSource, ¿usted conoce alguna otra manera de llamar a un archivo de configuracion externo? Estuve mirando la posibilidad de "linkedConfiguration File" pero fue mas un "tiro al aire" porque no encontre algun ejemplo claro de usarlo.
Muchas gracias Leandro por tomarse el tiempo y tratar de ayudarme.
Mauro
hola Mauro
ResponderEliminarParece ser que es un problema conocido y de hace tiempo
ConfigSource attribute on config sections doesn't support parent or absolute config paths
saludos
Leandro mil gracias por su colaboracion! Será pensar entonces en otra opcion...que lastima
ResponderEliminarDe nuevo mil gracias por su tiempo
Saludos desde Medellin, Colombia
Hola Leandro, tengo una consulta, tengo un problema para crear un log en aspenet, como podria hacerlo..
ResponderEliminarHola, tengo una consulta, soy nuevo programando en aspnet, pero como podria crear un log, en mi aplicativo, o como hacer q grabe un archivo log..
ResponderEliminargracias
hola Carlos
ResponderEliminarcuando dices log te refiere a dejar registro en un archivo de texto ?
de ser asi podrias usar log4net
Log4Net with ASP.NET 3.5 – File Appender
How to use log4net
saludos
Gracias es justo lo que buscaba
ResponderEliminarHola Carlos muy interesante tu aporte, pero me gustaria saber lo siguiente yo tengo un aplicativo en donde quiero guardar el numero autogerenado, nombre del cliente, cargar archivo, fecha de inicio y la fecha limite. Mi pregunta es como puedo guardar el archivo teniendo varios datos? y como lo puedo aplicar en N capas =?, ya busque de varias formas y no encontre algo que aplica con N capas y guardar archivos teniendo varios datos. Espero que me puedas responder mi pregunta y me puedas dar un pequeño aplicativo. gracias
ResponderEliminarhola Kely
ResponderEliminarno ahs revisado algo como esto
[N-Tier] – Desarrollo en capas - Ejemplo Facturación – Parte 3
saludos
Muchas gracias pero no es lo que requiero lo que estoy buscando es grabar los archivos en la base de datos pero implementando la arquitectura de N capas con asp.net. para la web. Aparte que me grabe la data siguiente codigo autogenerado, nombre del cliente, cargar documento y guardarlo en la base de datos ("[ASP.NET] Grabar Archivo en base de datos"
ResponderEliminar) y la fecha de inicio fecha fin de solicitud. algun ejemplo pero con la arquitectura de N CAPAS para web service.
hola Kely
ResponderEliminarpero es que deberias unir lo planteado entre ambos articulos
veras que este sua una entidad con una propiedad del tipo byte[] que podrias enviar hasta tu capa de datos
y usando el ejemplo en capas del link que proporcione podrias crear dos queries para insertar en ambas entidades desde la capa de negocio
es solo cuestion de unir lo explciado en ambos articulos
[ASP.NET] GridView – Edición Empleados
saludos
Esta bien solo queria un ejemplo implementando la arquitectura de N capas utilizando aspnet-grabar-archivo-en-base-de-datos.html, ya que no se como implementar ello, es por ello que requeria de un ejemplo de todas maneras Muchas Gracias por tu tiempo =).
ResponderEliminarHola Leandro yo requiero una ayudita en asp.net web services quiero decir para pagina web cliente y servidor
ResponderEliminarVeras estoy haciendo un aplicativo en donde utilizo procedure, pero no se como hacer para grabar el archivo en base de datos utilizando procedure, lo peor de todo es con N capas yo vi este y me pareció interesante, pero yo tambien requiero un ejemplo para grabar archivo en la base de datos pero con procedure y utilizando N capas.
Para poder explicarte mejor Lo que hago es utilizar la capa entidades de hay me voy a datos para llamarlo, luego voy a la capa negocio y después a la interfaz, para que puedas entender mi problema te podria mandar por correo mi aplicativo y así podras entenderme mejor y tal vez darme una manito en ello. Lo malo es que no se donde esta tu correo gmail.
hola
ResponderEliminarhabias visto este articulo
[ASP.NET] - Guardar Imagen base de datos
que este en capas o no es exactamente igual, porque lo que usas es un array de byte para transportar la imagen y persistirla
el correo esta en la seccion de perfil del foro
saludos
Hola Leandro disculpa tuve un error en mi comentario anterior. Esta es mi consulta me fue util este ejemplo de cargar el archivo y guardar en la base de datos,
ResponderEliminarpero tengo una pregunta, Como puedo modificar el archivo o mantener el archivo que esta previamente guardado en mi base datos de tipo varbinary?. Cabe mencionar que aparte de modificar mi archivo tengo otros datos.
Por ejemplo yo utilizo esto para capturar mi dato nombre que previamente lo llamo de mi capa negocios
txtNombre.Text = Convert.ToString(capanegocios.DatosCliente(objeto).Tables("DatosCliente").Rows(0).Item(1))
Pero no se como capturar el dato que cargo que en este caso son archivos o no se si estara bien realizarlo de la siguiente manera?
FileUploadCargaArchivo.Visible = Convert.ToString(capanegocios.DatosCliente(objeto).Tables("DatosCliente").Rows(0).Item(2))
Y en mi boton grabar realizo esto
objeto.bNomcliente = txtNombre.Text
Espero tu respuesta gracias.
hola sadako
ResponderEliminarprimeramente pudo comentarte que poner todo esto:
capanegocios.DatosCliente(objeto).Tables("DatosCliente").Rows(0).Item(2)
en una linea del codigo no esta nada bien
porque si pones esto en varias lineas estas recargando continuamente el objeto y consultando a la db, lo cual es muy malo
separa las lineas
Dim ds As DataSet = capanegocios.DatosCliente(objeto)
Dim dt As DataTable = ds.Tables("DatosCliente")
Dim row As DataRow = dt.Rows(0)
TextBox1.Text = CStr(row(2))
se que son varias linea pero es mucho mas ordfenado de esta forma, es ams deberias poner los if que validen si tienes un datatable y si hay registros en el mismo, para evitar errores
saludos
hola sadako
ResponderEliminarpara mentener un archivo que esta en la db no hay otra forma que recuperarlo, editarlo y volverlo a insertar
no hay magia en esto de forma directa contra el campo no se puede, se recupera, se vuelve al archivo original y se actualiza
asignarlo al FileUpLoad no puede, sino que haces que el usuario lo descargue a su pc local,m lo edite y lo vuelva a subir
saludos
gracias por tu buen aporte leando
ResponderEliminarqueria consultarte algo ya corri el scrip en sql server y el proyecto en vstudio 2010 frameswork 4.0 pero al pero ya al subir el archivo no hace nada tampoco me de error sera por la version lo que veo es qla cadena de coneccion esta con sql express podria ayudarme te lo agradescomo
hola edgar
ResponderEliminarde casualidad la db que usas de sql server esta como un mdf dentro de la solucion ?
lo pregunto porque si es asi recuerda que el VS realzia una copia a la carpeta \bin\Debug
es alli donde impacta las modificaciones cuando ejecutas la aplciacion desde el VS
saludos
Felicidades por tus publicaciones Leandro!
ResponderEliminarBuenas tardes Leonardo. Cordial Saludo.
ResponderEliminarTe quiero consultar algo sobre esta excelente publicación.
Funciona a las mil maravillas, pero si deseo usarla para distintas categorias de descarga(ejemplo:resoluciones,formatos pdf), como lo implementaria usando este mismo codigo y páginas.
Muchas gracias
hola Orlando
ResponderEliminarno se que sera una "resoluciones" en el sentido de formato, pero si tienes diferentes tipo de documento solo defines el
Response.ContentType
correcto y eso es todo, deberias guardar en un campo la extension o tipo del archivo que registras
saludos
Hola Leandro. Quiero hacer un híbrido entre la carga en BD y la carga en carpeta. que sucede, voy a manejar varias categorías como por ejemplo vehiculos, motos, barcos. En lo que estoy pensando es que en la BD guardo datos del archivo como autor, descripción y el nombre, y categoria; en una carpeta va a residir el archivo. Al cargar, veo que el gridview muestra todo con la siguiente línea;
ResponderEliminarDim fileInfo As FileInfo() = dirInfo.GetFiles("*.*", SearchOption.AllDirectories)
Es posible manipular el *.* para que me cargue solamente la lista de archivos dependiendo de lo que consulte en la base de datos?
me explico, en la BD guardé en una misma categoria carros.doc, carros.mp3 y carros.ppt, existentes en la carpeta donde hay otros archivos adicionales pero solo quiero mostrar esos 3.
Gracias
hola fealso84
ResponderEliminarpero es que en la db junto a la info deberias tener un campo que indique el nombre del archivo al cual hace referencia ese registro
entonces usar el GetFiles() no aplcia porque recuperas el registro que cargas en el grid y con el nombre del campo armas la invocacion el link para tomar ese archivo y generar la url
pero debes vincular el archivo fisico con el registro de la db de alguna forma
saludos
Hola Leandro. pues ya revisé y me decidí a trabajar todo sobre la base de datos.
ResponderEliminarAhora tengo esta duda con el siguiente código:
Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", archivo.Nombre))
Response.ContentType = "application/octet-stream"
Response.BinaryWrite(archivo.ContenidoArchivo)
Response.[End]()
Veo que este código realiza la descarga, ¿pero si quiero cargar el documento en un iframe? como le inidico al navegador que lo muestre. afortunadamente todos los clientes van a trabajar con IExplore.
Gracias
hola fealso84
ResponderEliminarla integracion del documento dentro del browser depende de la aplciacion que tenga el cliente instalado
si este tiene el office entocnes podra ver integrado los documento de word, excel
ahora si tiene el acrobar reader instalador podra ver integrado los pdf
el tema es el que iframe trabja con el mismo principio solo integrara si se dispone de la aplicacion asociada y esta se integra al IE
en el iframe solo defines la url al handler indicando el que querystring el nombre del archivo que quieres recuperar
saludos
Hola. Como lo estoy haciendo tengo asegurado que tendran los aplicativos. pero sinceramente no se como indicar la url de descarga. el aplicativo es para una intranet.
ResponderEliminarGracias.
hola fealso84
ResponderEliminarsi la idea es definir un handler la url de descarga claramente sera el nombre del handler, como lo hago en el articulo
nombrehandler.ashx?archivo=nombrearch.doc
y le pasas un parametro por querystring en la url del handler indicando el nombre del archivo que debe enviar
saludos
Hola Leandro. Revise el handler que pusiste para descargar el archivo, sino que no se, que habria que modificar para que no descargue sino que lo tenga en memoria sobre la pagina. pues hice la prueba con el tuyo pero no lo muestra en el iframe sino que le ordena al navegador que lo descargue. Gracias
ResponderEliminarhola fealso84
ResponderEliminarde que tipo de documento se trata ?
lo estas ejecutando sobre el IE ?
recuerda que el que se muestre embebido depende de la integrtacion de la aplicacion con el browser
sino esta la aplicacion debidamente integrada, o no esta presente una aplicacion por defecto para editar ese tipo de archivo el browser por defecto mostrara el dialogo de descarga
saludos
Hola, Efectivamente trabajo con IExplore, documentos de todo tipo: word, Excel, PowerPonit y pdfs que están contenidos en el handler que tu creaste. pero me sigue mandando la descarga.
ResponderEliminarhola
ResponderEliminarviendo el codigo que habias puesto anteriormente el problema esta aqui
Response.ContentType = "application/octet-stream"
si defines octet-stream siemrpe descargara, para que se integre debes definir el ContentType correcto para el tipo de documento
Internet media type
saludos
Hola oye tengo una duda que nadie me a podido resolver en donde la puedo escribir. Veo que tu escribes en muchos blogs y creo que me podras ayudar.
ResponderEliminarLa duda es que tengo en mi B.D. guardados archivos tipo .docx .xlsx y .pdf en un campo tipo varbinary. Pero necesito mostrarlos embebidos en una pagina web en ASP.NET. No he podido encontrar alguna ayuda. Gracias.
ResponderEliminarhola Daniel
ResponderEliminarpodrias usar la opcion de contacto de mi perfil del blog, esto me llegaria por mail
o sino podrias preguntar en el foro
asp.net foro
saludos
hola Daniel
ResponderEliminarembeber un documento en el browser no es algo que puedas asegurar siempre vaya a funcionar, porque es algo que el browser implementa
si envias en el Response el documento con el ContextType de este, browsers como ser el IE si tienen una aplicacion local que inteprete esa extension hara la integracion para que se muestre el documento
pero otros browser como ser Chrome no lo hacen
en resumen solo si hay una aplicacion que se asocie he integre al browser funcionara, sino no, solo descargara el archivo
saludos
Entiendo entonces que no es una opcion muy viable. Habia leido en otra web el uso del tag embed para mostrar archivos .pdf guardados en el servidor. Es asi como quiero mostrarlos con la unica diferencia de que el archivo esta guardado en una base de datos.
ResponderEliminarHOLA LEANDRO..
ResponderEliminarEN el foro de MSDN mas ayudado ya varias veces pero en esta ocasión e intentado acceder al foro pero no entra.. bueno la cuestión es que ocupo bajar archivos de un sitio web procesarlos el mi pc y después subirlos pero a otro sitio web.. lo que veo es que tu lo ases con asp. pero yo lo tengo que realizar con una aplicación de consola en la que el usuario no participa solo corre la aplicación y la aplicación ase todo..tendria que modificar muchas cosas para adaptarlo a una aplicacion de consola???
hola leandro primero decir que es un muy buen post me ayudo un montón, lo segundo es que tengo un problemilla con un gridview en VB.net (se que no es tema pero si tendrías un ejemplo me ayudaría) bueno el problema es que quiero hacer aparecer un modal popup cuando doy clic en cualquier parte del gridview para luego que en dicho popup se carguen los datos de la fila seccionada del gridview para poder editarlos, agradeceria mucha tu ayuda.
ResponderEliminarhola MPG Motors
ResponderEliminarlo que presionar en cualquier parte del grid habria que evaluarlo, ya que vas a necesitar algo de jquery para que funcione y lo veo complicado
pero si podrias editar los datos en un popup
[ASP.NET] PopUp Edición - Usando Ajax Toolkit ModalPopupExtender
saludos
Hola Leandro soy nuevo en esto, me podrias ayudar lo que pasa es que no m guarda los archivos que subo a mi BD? Como podría hacer disculpa mi ignorancia.
ResponderEliminarhola Boss
ResponderEliminarlo que planteas es muy generico y sin datos completos del problema, como ser que db usa, si esta integrada al visual studio
si se esta generando algun error
saludos
Hola Leandro estoy conectando SQl Server 2008 con .Net ASP C#.
ResponderEliminarSi puedo Guardar los archivos que subo pero los guarda solo en la carpeta mas no en la base de datos.
Quisiera saber en que parte de código debería buscar para solucionar el problema, y que me aparezca dentro de la base de datos porque solo me sale en la pagina cuando la cargo, no me brota ningún error sube los archivos pero no lo visualiza en la BD, saludos!
hola Boss
ResponderEliminarno has validado la primer parte de este articulos, porque es justamente lo que hago dejar el archivo en una carpeta
pero ojo porque en la db no puede guardar el path completo debes poner uno relativo, se supone que en la db solo debes registrar el nombre del archivo y nada mas
porque se supone si el archivo esta en una carpeta del sitio debes armar una url relativa y no una fisica
saludos
Hola Leo, muy bueno tu Post quisiera saber si conoces el comando necesario para hacer lo mismo de obtener el archivo pero dentro de una aplicación Windows Forms.
ResponderEliminarSaludos y gracias por tus aportaciones tan valiosas!!
Yanin
hola Yanin
ResponderEliminaraqui
[WinForms] Edición Empleados
no son archivos pero si se recupera imagenes de la db en una aplicacion de escritorio
para los archivos lo unico es que debes usar el
File.WriteAllBytes()
para poner el byte[] en un archivo fisico
saludos
Muchas gracias Leandro, eres muy amable lo voy a revisar para aplicarlo.
ResponderEliminarSaludos!!
el código me sirve en visual studio 2010??
ResponderEliminarLeandro una pregunta lo que pasa es que yo en mi aplicación web quiero poner una sección para agregar comentarios pero como le puedo hacer???, yo estoy usando visual studio 2010, asp.net y visual basic.net y una base de datos en sql server 2008...si me puedes aclarar esta duda te estaría muy agradecido....
ResponderEliminarhola Manuel
ResponderEliminarsi este codigo puede usarse con VS2010
podrias poner un control estilo gridview o listview donde listas los comentarios que ya esten registrados
y luego un simple textbox donde el usuario escriba el comentarios
el resto simplemente es tomar el click del boton y crear el INSERT contra la db para persistir el comantario y actualizar el grid que listaria los existentes
saludos
Muchas gracias leandro por tu ayuda, ahora me dispondré a intentarlo, haber que tal queda...
ResponderEliminarPor fin logre hacer el de subir archivos en una carpeta, solo que me marcaba error( me decía que el gridwiew no estaba accesible, bueno en el caso el control fileupload también me marcaba lo mismo) y pues lo resolví quitando la parte de:
ResponderEliminarNamespace GuardarEnCarpeta
End Namespace
En realidad no se que se signifique eso, pero lo importante es que quedo, Muchas Gracias Leandro.....
hola Manuel
ResponderEliminarel namespace define el ambito donde estara la clase declarada
quizas solo tenias que definir el
Imports GuardarEnCarpeta
para poder acceder a la funcionalidad de ese espacio de nombres
saludos
Hola leandro pregunta este ejemplo maneja archivos .doc .pfd y .xls pero como se sabe q ahora microsoft genero un nuevo .docx y .xlsx como se cambiaria hay?
ResponderEliminarhola jonathan
ResponderEliminarpara el upload del archivo y el grabarlo en la db no cambia en nada
donde si vas a tener que cambiar es en el Response.ContentType, ya que deberias definir el correcto dependiendo del tipo de archivo
MIME Types List
por ejemplo para xlsx usarias: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
saludos
Cordial saludo leandro estoy haciendo un programa ejemplo de correo y pues en la parte de configuracion creo q lo tengo bien pero pues al enviar me sale el siguiente error: Mailbox unavailable. The server response was: relay not permitted.
ResponderEliminarno se que pueda ser....
hola yonathan
ResponderEliminarno entendi, que relacion tiene este articulo con un problema con el envio de un mail ?
quizas desde el sitio donde quieres enviar el mail no tenga acceso al servidor SMTP para poder enviarlo
valida que esa pc puede acceder a el servidor que brinda el servicio de smtp
saludos
Leandro, quiero hacer algo muy parecido a lo que muestras en este ejemplo, solo que, lo que quisiera es que al darle click al nombre del archivo (ej. documento.txt) en vez de descargarse, se visualice en otra pagina!
ResponderEliminarSaludos,
Iván
hola Iván
ResponderEliminarsi al enviar el archivo defines el Response.ContentType correcto el browser podria intepretarlo y mostrarlo embedido
igualmente esta es funcionalidad del browser, sino tiene una aplciacion asociada con al extension mostrara el dialogo de descarga, ademas no todos los browser tienen esta capacidad
saludos
Lauro, en el Hyperlink de mi gridview tengo el siguiente codigo html
ResponderEliminar<asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Name", "~/files/{0}") %>'
Como puedo hacer variable la parte "~/files/" por el contenido de una variable de programación.
Lo que quiero es que, el hyperlink abra el archivo del nombre correspondiente pero según la ubicación en la que este!!
Trabajo con web developer usando asp.net vb.
hola Iván
ResponderEliminara que llamas "la ubicación en la que este"? porque recuerda estas en un desarrollo web, los link solo aplican si el archivo esta dentro de la estructura del sitio web que creas en el iis
no pueden estar en cualquier lado, al menos deben estar dentor de la estructura de carpetas del sitio
saludos
Si, por ejemplo, hasta el momento muestro en un gridview el contenido de "~files/" (Que es una carpeta que esta en el servidor) y luego con ayuda del hyperlink tengo acceso a los archivos de esa carpeta en base a su nombre.
ResponderEliminarLo que quisiera es hacer esa ruta variable en el codigo html
<asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Name", "~/files/{0}") %>'
Si por ejemplo yo quisiera hacer una carpeta dentro de "~files/" y ahi colocar un archivo.
Saludos y espero haberme dado a entender !
hola Iván
ResponderEliminaralgo que no defines es desde donde quieres hacer variable el nombre de la carpeta
sera desde codigo .net quizas usando una propiedad publica, por lo cual usarias
<asp:HyperLink ID="nombre" runat="server" NavigateUrl='<%# Eval("Name", this.NombreProp + "{0}") %>
si defines en la pagina una propiedad publica podrias poner la ruta dinamicamente alli para que cambie, quizas tomando esta desde un archivo de configuracion
pero recuerda que sigue siendo una carpeta relativa dentro del sitio, no es una ruta fisica
saludos
hola una Consultita
ResponderEliminarestoy realizando un proyecto en asp.net C# y quiero trabajar con controes Ajax pero no funcionan me sale errores a que se debe... estoy trabajando en Visual 2010 y sql 2005
alguna alternativa para que el cliente ingrese la fecha correcta como se registra en la base de datos
al ejecutar me sale el siguiente error
ResponderEliminarError en tiempo de ejecución de JavaScript: No se puede obtener la propiedad 'UI' de referencia nula o sin definir
o simplemente se abre el explorador buscando la carpeta de controles Ajax pero el Dll lo tengo en mi proyecto ayuda...
hola una Consultita
ResponderEliminarestoy realizando un proyecto en asp.net C# y quiero trabajar con controes Ajax pero no funcionan me sale errores a que se debe... estoy trabajando en Visual 2010 y sql 2005
alguna alternativa para que el cliente ingrese la fecha correcta como se registra en la base de datos
hola Naty
ResponderEliminarde casualidad en la pagina has puesto el control ToolkitScriptManager
Comenzando con ASP.NET AJAX Control Toolkit
saludos
Pues la verdad no he estado utilizando ScriptManagement únicamente ese no encuentro en mis herramientas el ToolkitScriptManager, he estado revisando el archivo del link que me has enviado voy a probar Gracias...
ResponderEliminarme sigue saliendo el mismo error
ResponderEliminaragregue a la pagina Maestra un ScrptManagementy a otra opagina el ScriptManagementProxy pero sigo con el mismo error ayudaaaa, que estoy haciendo mal...
hola Naty
ResponderEliminarestas usando la ultima version de Ajax toolkit? que .net framework utilizas ? porque lo que comente quizas no aplique a todas las versiones
no probaste crear una pagina simple sin master page y colocar el ScriptManager alli junto al control de ajax tookit para validar que funcione
por lo general cuando algo no funciona debes ir a casos simple y luego incrementar la complejidad
saludos
Señor Leandro como siempre sus aportes y conocimiento INVALUABLES
ResponderEliminarSeñor Leandro como siempre sus aportes y conocimiento INVALUABLES
ResponderEliminarSeñor Leandro como siempre sus aportes y conocimiento INVALUABLES
ResponderEliminarModifique el proyecto para que aceptara archivos rar pero con archivos de este tipo de varios megas entre 4 y 10 mas o menos no funciona, ¿o hay alguna forma para guardar los rar?
ResponderEliminarhola Dionisio
ResponderEliminarpor defecto la web limita el tamaño de los archivos que se pueden subir
pero puedes ampliarlo por configuracion
Limiting the File Upload Size in ASP.NET
en el link veras que cambiar en el config para ampliar este limite
saludos
Hola Leandro Buen Día, ahora te contesto por aquí, oye este me va ser perfecto, para lo que ocupo sencillito, hace lo que quiero, al fin y acabo es un tabla que muestra los archivos y se puedes descargar solo que sera una ruta que yo le daré, ademas de cargar los archivos de las actividades, de lo otro que preguntabas (chkb.Checked = Convert.ToBoolean(drview[2]);) y la verdad no lo recuerdo por que lo hice, estaba medio dormido ya le reviso mas adelante. Gracias por tu Ayuda.
ResponderEliminarbuenos dias una pregunta como puedo hacer para cuando abra el pdf lo visualize en una nueva ventana??
ResponderEliminarhola beto
ResponderEliminarno has mencionado como es que lanzas el pdf, pero podrias usar javascript con
window.open(url?file=archivo.pdf);
para lanzar la ventana que cargaria el pdf
saludos
Que Tal Leandro primeramente Muy Buenos Tus Aportes...
ResponderEliminarTengo un error al momento de querer descargar el archivo implemente el método de guardar los archivos en la BD para de ahi descargarlos...
http://i.imgur.com/KwdIOxt.png
Mi Proyecto esta subido en un hosting y al querer descargar el archivo me salta ese error..
Es de Recalcar que cuando lo estoy ejecutando localmente me descarga sin problema cualquier archivo que tenga guardado en la BD.
hola Cristhian
ResponderEliminarestas definiendo en el web.config el registros del handler ?
quizas cuando lo subes al hosting no actualizaste la seccion del handler se registran
tambien valida que el ashx como archivo lo hayas subido al hosting
saludos
Mister Leandro una consulta? cuando importo excel a mi asp.net quisiera saber como puedo trabajar desde asp. net y poder agregar campos a excel como por ejemplo usuario , y clave me podrias ayudar
ResponderEliminarhola Daniel
ResponderEliminara excel puedes accederlo de varias formas:
- usado ado.net, y usas el excel como si fuera una db, haciendo un INSERT de los datos
- usando las api de office, con esto tienes toda la funcionalidad pero requiere que instales office en la pc donde esta el sitio web
- usar alguna libreria open xml como ser ClosedXml, lo unico que el excel debe ser office 2007 o superior, o sea se necesita de un .xlsx
como veras variantes hay varias, no se cual quisieras utilizar
saludos
Hola Leandro una pregunta y si quiero que mis archivos se eliminen automáticamente despues de que tengan 5 dias de averlos subido como se haria ese.
ResponderEliminarHola Leandro.
ResponderEliminarQuisiera saber si es posible abrir archivos(office) guardados en una base de datos editarlos y volverlos a guardar en la base de datos, estos archivos los tengo como varbinary(max).
Saludos
hola david
ResponderEliminarpoder puede hacerlo, con solo realizar una query a la db podrias recuperar el byte[] del archivo
el tema es que estas en un ambiente web, por lo que deberias enviar el archivo al cliente para su descarga, este lo modifica local en su pc y luego realizar un upload para actualizar el campo por medio de un UPDATE
si buscabas algo integrado no se puede
saludos
Gracias Leandro.
ResponderEliminarSi no se puede realizar de forma integrada, como podría dar al usuario la opción de guardar el archivo en una ruta que sea web desde el explorador de windows, algo como lo que pasa en SharePoint, que puedes descargar archivos en red y guardarlos de la misma forma en red utilizando una url de red en el explorador de windows, donde se puede ver el sitio de sharepoint dentro del explorador que se abre al elegir en el documento "guardar como" y este se guarda en la base de datos de sharepoint.
En resumen, que tecnología o controles podría utilizar para imitar el comportamiento de sharepoint?
hola david
ResponderEliminarla verdad no se si exista algun componente similar a sharepoint que permita editar los archivos de una careta en el servidor
lo mas cercano que conozco es:
http://cksource.com/ckfinder
saludos
Hola Lenadro, despues de investigar opte por la opción de guardar archivos físicos temporales, pero tengo una consulta en cuanto a la diferencia entre Process.Star() y Response, con Process todo funciona bien pero cuando tengo la aplicacion web corriendo de forma local y abro el archivo de forma local, pero cuando publico la aplicación en un servidor,Process.Star no abre el archivo en el cliente, con Response si la abre, estoy usando una ruta absoluta que puede ver el cliente y el servidor, ya comprobé que el archivo lo guarda bien el servidor en la ruta y los clientes lo pueden abrir bien.
ResponderEliminarMi problema es que estoy utilizando process.Exited += process_Exited; para saber cuando el archivo físico temporal se cerro y así poder leerlo de nuevo y guardarlo en BD, pero no se como hacer que este Process se lo ejecute el cliente y no el servidor
hola david
ResponderEliminarque no te confunda el hecho de desarrollar localmente el server y el cliente ejecutaran en la misma pc, piensa siempre que el servidor estara remoto
El Proces.Start() lanza la aplicacion en el servidor por eso en el cliente nucna la veras
el Response envie la respuesta al cliente, si pones un archivo le mostrara el cuadro de descarga
pero la ruta debe ser la fisica pero del archivo en el servidor, por eso se usa en este caso el Server.MapPath()
desde un desarrollo web olvidate del Process o algun control de cuando se cierra un documento no puedes lograrlo, si quieres hacerlo entonces no es un desarrollo web lo que necesitas
el documento se descarga al cliente, lo modifica localmente y lo vuelve a subir al servidor mediante un upload, si quieres pisando el que tenias previamente
saludos
Gracias por la respuesta. Solo tengo una duda mas, como podría abrir una aplicación de WPF desde una aplicación web, pensaba poner un link o hipervinculo en la aplicación web que abriera la aplicación WPF, pero quisiera saber si se puede hacer que la aplicación reciba algunos parámetros de entrada, al iniciarse, como por ejemplo un "int" o un "bool", esto es posible y de serlo podrías darme algún ejemplo?
ResponderEliminarhola david
ResponderEliminarpero cual serial el objetivo de esto que planteas
la aplicacion estara instalada en la pc del usuario ?
o quieres abrirla desde codigo .net? porque si es esto ultimo ten en cuenta que ejecutara en el servidor
se puede usar la clase Process y a esta definirle argumentos
ProcessStartInfo.Arguments (Propiedad)
saludos
La aplicación WPF esta instalada dentro de una intranet, por lo que los usuarios pueden abrirla locamente en sus equipos, lo que quisiera, es que desde una aplicación web (aspx), que funciona en la misma intranet, los usuarios tengan un lik o botón que abra la aplicaron wpf, en sus equipos, pero que esta aplicación wpf reciba un id que le pasaría la aplicación web.
ResponderEliminarYa probé que los usuarios puedan ejecutar la aplicación de escritorio si esta esta instalada en una ruta de la intranet.
Mi objetivo es que brindar a los usuarios un tipo de gestor de documentos mediante la aplicación de escritorio, pero que desde la aplicación web puedan elegir un documento o folder especifico y este ID sea el que abre la aplicación de escritorio de inicio y así controlar la edición del documento de forma local, pero conectado a la BD
hola david
ResponderEliminarpues la verdad no me queda claro como una aplicaicon en internet puede ejecutar local en la pc del usuario, hasta donde se .net no permite ejecutar remoto
si es una aplicaicon desktop se instala en la pc del usuario, en internet podrias publicar el instalador, pero no la aplicacion
saludos
La aplicación la tomo de la carpeta "Release" del proyecto wpf y pongo esos archivos en una carpeta con esta ruta "\\SERVIDOR\FolderCompartido\(archivos del wpf)"
ResponderEliminary en el aspx tengo algo como esto "
de esta forma la pagina web ejecuta la aplicación en los clientes, ya que todos tienen acceso al "FolderCompartido", lo que quisiera es pasarle un parámetro de inicio al exe, lo he intentado de la forma "?param=X" pero no toma en cuenta el parámetro X, solo ejecuta la aplicación sin parámetros, probé la aplicación WPF debugeando con un parámetro de inicio y funciona bien. No se como resolver esto, si tuvieras alguna idea seria de mucha ayuda, ya que no se si el problema este en el WPF o en la forma de llamar el wpf desde aspx con el href.
en el aspx tengo un hyperlink con esto NavigateUrl="\\SERVIDOR\FolderCompartido\Documentos.exe
ResponderEliminarhola david
ResponderEliminarpero al poner un link al .exe lo que haces en realidad es que se descargue la aplicacion, un usuario podria seleccionar guardar el .exe sin ejecutarlo
ademas podrias haber puesto la aplicaicon en el Response como lo realizo en este articulo, de esta forma no necesitas compartir ninguna carpeta
pasar parametro no puedes, porque como comente, con el hyperlink estas descargando la aplicacion no ejecutandola
la ejecucion se da porque el browser lo permite despues de descargar
por eso te decia, la aplicacion deberia descargar un instalador, o mejor si usas ClickOnce, pero deberias redistribuir la aplicacion no ejecutar al descargar
saludos
Muchas gracias por la respuesta, entonces no hay forma de ligar la aplicación web y de escritorio aunque la de escritorio este instalada en todos los clientes y pesarle un parámetro de inicio?
ResponderEliminarMe recomiendas manejarlas por separado?
hola david
ResponderEliminarhasta donde conozco no es buena idea
manejar en el cliente una aplicacion desde el browser
el tema es que no tienes control, imagina la aplicacion ejecutando en internet, como haria para compartir la aplicacion
yo veria de menejarlo por separado
saludos
Hola Leandro queria hacerte una consulta, quiero guardar de un formulario de Visual Basic.NET 2010 archivos PDF a SQL Server 2008 , tienes algun ejemplo similar(código, conexion sql), te agradeceria si me explicas en detalle. Saludos y muchas gracias de antemano.
ResponderEliminarhola JAVIER
ResponderEliminares que desde winforms no hay mucha diferencia a lo planteado en este articulo
la parte de la persistencia es identica
lo unico que cambia es que no necesitas de un upload del archvio al servidor sino que podrias usar el File.ReadAllBytes() para recuperar el byte[] que pondrias en el parametros del INSERT
saludos
Leandro, muchas gracias por la ayuda, en verdad tus post son geniales, tengo una duda, acabo de implementar el procedimiento de Guardar archivos en la Base de Datos y todo va genial, sin embargo, si guardo un archivo con nombre largo con espacios, al guardarlo y mostrarlo todo correcto, pero al descargarlo, me muestra y guarda el archivo solo con la primer palabra del nombre y sin extensión, esto en donde lo puedo corregir?.
ResponderEliminarMuchas gracias!
hola Jack
ResponderEliminareso se corrige en esta linea
context.Response.AddHeader("content-disposition", string.Format("attachment;filename={0}", archivo.Nombre));
cuando armas el nombre que tendra el archivo, alli quita los espacios usando el Replace()
saludos
Muchas gracias nuevamente Leandro, esto lo hice en la Clase ImagenesDAL.vb, en el procedimiento GuardarImagen, al momento de agregar los parámetros para nombre, quito los espacios vacíos con la siguiente instrucción:
ResponderEliminarcmd.Parameters.AddWithValue("@nombre", nombrearchivo.Replace(" ", String.Empty))
Lo cuál me funcionó muy bien, mi pregunta es, ¿se puede obtener el archivo para descarga correctamente aunque el nombre contenga espacios vaciós?, ¿es posible esto?.
Gracias nuevamente!
Saludos!!
hola Jack
ResponderEliminarla verdad nunca lo intente, pero se que windows al usar carpetas con espacios define la ruta usando comillas dobles
quizas si aqui se aplica el mismo concepto tambien lo reconozca
aunque estoy en duda porque el nombre en realidad se envia al browser, no se como lo interpretara cada uno, quizas IE lo tome bien, pero habria que verlo con FireFoxy Chrome
saludos
hola Leo, me puedes ayudar subiendo el archivo para vb.net (asp.net), trato de descargarlo para apoyarme a lo que necesito hacer, pero me envia error, y lo otro, como defino en la tabla el nombre del campo, el tipo de dato para el archivo.
ResponderEliminarhola Marco
ResponderEliminarya esta actualizado
saludos
Hola Leandro,
ResponderEliminarexcelente post, me funciona correctamente la descarga y el guardado en la base de datos para archivos PDF, solamente tengo un error:
- cuando quiero visualizar el archivo PDF, no encuentra el recurso. El error es el siguiente:
Error de servidor en la aplicación '/'.
No se encuentra el recurso.
Descripción: HTTP 404. El recurso que está buscando (o una de sus dependencias) se puede haber quitado, haber cambiado de nombre o no estar disponible temporalmente. Revise la dirección URL siguiente y asegúrese de que está escrita correctamente.
Dirección URL solicitada: /DescargaArchivo.ashx
Información de versión: Versión de Microsoft .NET Framework:4.0.30319; Versión ASP.NET:4.0.30319.34212
Estoy utilizando Visual Studio 2013 con c#. Cabe mencionar que en tu ejemplo ocurre el mismo error en GuardaEnDb.
Espero puedas ayudarme.
Desde ya, muchas gracias!
Saludos.
muchas gracias!!! Leo, me ha sido mucho utilidad, es lo que necesitaba.... tengo un problema al cargar la pagina para guardar archivo en la base de datos, y me gustaría saber como tiene definida esta variable en la tabla archivos, que tengo problemas para acceder también a la bdd.
ResponderEliminarsaludos/gracias...
se me fue contarle que estoy trabajando con vb.net 2008 y sql server 2008
ResponderEliminarhola Aaron
ResponderEliminardefines en el web.config la configuracion del handler ?
sino configuras el handler la extendion .ashx no la va a reconocer
saludos
hola Marco
ResponderEliminarla verdad es poca la info que porporcionas del problema
cuando carga la pagina obtienes algun mensaje de error ?
saludos
Leo!!!, si la consulta es la siguiente, al cargar la pagina por el modo "guardar en carpeta" funciona perfectamente, pero cuando ejecuto la pagina en el modo "guardar en bdd", envía un mensaje de error que no puede encontrar la conexion con la bdd, ya que no es compatible con la versión ****.....
ResponderEliminartrato de adjuntarlo directamente desde el motor bdd, pero tampoco me deja y envía el mismo mensaje de error (baje la misma versión que adjunta en el blog)
ahora lo que me gustaría saber es como defines en la bdd la tabla archivos, el campo donde queda almacenado el documento, es decir....
Nombre campo Variable
Codigo varchar(10)
Nombre varchar(50)
Fecha Date
length ?????
archivo ??????
me imagino que los dos últimos length quiere decir el tamaño del documento y el archivo donde queda el documento.
Hola Leandro,
ResponderEliminarsí, sí defino la configuración del handler en el web.config, estas son mis definiciones:
add verb="*" path="*.ashx" type="SIGA.DescargaArchivo.HttpImageHandler"
No sé si se tenga que agregar el controlador genérico al proyecto, si es el caso; debería ir en carpeta raíz, qué código debería de llevar?
Saludos
hola Marco
ResponderEliminarese error se produce cuando el mdf es incompatible con la version del servicio de sql server que tienes instalados
podrias probar attachar la db directo al sql server mediante el sql server management studio y conectarte directo al servicio, o sea no usar attach dinamico
sino la otra seria crear una db nueva y crear las tablas mediante script
exacto esos dos campos indican el tamaño del archivo y el ultimo seria varbinary para contener el byte[] del archivo
saludos
hola Aaron
ResponderEliminarque raro, si tienes el handler deberia funcionar, aunque por lo que comentas este lo defines en otro proyecto, no?
si es asi podrias ponerlo en cualquier sitio (aunque una carpeta Handlers seria mas ordenado), se supone que has creado un proyecto del tipo Web Application por lo que todo el codigo que pongas en este compila a una dll
recuerda valida el namespace de la clase cuando la definas en el proyecto
saludos
Hola Leandro tengo un problema en el webconfig, pues me sale un mensaje de error en esta línea de código : <
ResponderEliminaradd verb="*" path="*.ashx" type="APPWEB.APPWEBCVS.Procesos.FileVB"
/>
Tengo como nombre de la solución a : APPWEB
como nombre de proyecto :
APPWEBCVS
como nombre de la carpeta donde contiene el handler: Procesos
y el archivo handler en si :
FileVB
, por cierto estoy programando en VS 2012
Gracias por tu ayuda.
hola Gerson
ResponderEliminarpero el nombre de la solucion no define el namespace, puede que el proyecto y la carpeta si, peor no es una regla, el namespace se puede cambiar
programas en c# o vb.net ?
si es c#, podrias ir a la definicion de la clase y ver el namespace en el cual lo declaras
si es vb.net recuerdo que habia una opcion para habilitar que muestre el namespace de la clase
saludos
Que tal Leandro,
ResponderEliminarNecesito cargar un archivo pdf y mostrar el nombre del archivo y la ruta del mismo en un gridview,con el fileupload lo carga pero al momento de mostrarlo en el gridview no se como hacerlo?? tu ayuda por favor...
Estimado Leandro:
ResponderEliminarlogré solucionar mi problema
pues era un error mio, estaba poniendo mal los namespace, por cierto programo en vb.net. Gracias por tu apoyo y sigue así.
Saludos.
hola Nahim
ResponderEliminarpero para mostrarlo deberias hacer el upload del pdf a una carpeta dentro del sitio
despues usarias la url del pdf para mostrarlo dentro de un tag <iframe>
si el cliente tiene algun aplicativo instalado que permite visualizar pdf y este se integra al browser veras el documento, pero ojo esto no funciona con todos los browsers
saludos
hola Leandro ..el problema que tengo es el mismo que haz realizado pero lo quiero hacer en mvc 2 como deberia de hacerlo ..ya que recien estoy empezando con mvc
ResponderEliminarhola Horacio
ResponderEliminara cual problema que he realizado te refieres ? no entendi
si es la ubicacion del archivo de base de datos en mvc no varia, puedes ponerlo en la carpeta App_Data
saludos
hola, bueno lo que tengo que hacer es un editor de texto (estoy usando richtexteditor) y lo estoy cargado el texto a un archivo .html que tambien lo puedo cambiar .txt pero e buscado de como subir el archivo que se crea a la base de datos con mvc2 pero nada y encrontre el tuyo con ASP pero es otra cosa con mvc2 ..la idea final de esto es crear el archivo a la base de datos (directorio) y luego jalarlo volver a conseguir el texto del archivo y publicarlo en una planilla web algo como un cms pero solo se consigue el texto del archivo pero solo queria saber como se puede hacer para subir el archivo a la BD y que se registre el directorio ..ojala me hayas entendido algo pero gracias
ResponderEliminarhola Horacio
ResponderEliminarpero si es html porque necesitas un archivo? porque no simplemente pones del html como texto en un campo de texto en la tabla en la db
si pones un archivo tendrias en la tabla un binario que deberas convertir en un file fisico para obtener el texto
quizas se podria hacer tomando el byte[] del archivo (de la db) y usarlo con un MemoryStream para poder asi realizar el Read() y tomar el texto que tiene dentro. Pero son muchos pasos, sin necesidad, cuando puedes poner directo el html en un campo sin ningun archivo
saludos
Hola Leandro:
ResponderEliminarcreo que no me deje enterder bien solo queria guardar el la direccion del archivo (c:/temp/archivo.html) pero esto seria en una carpeta de la aplicacion y la idea de crear el archivo es que va a tener mucho texto y no cargar memoria a la bd y solo usar un string para tener el directorio del archivo que se crea pero ya lo solucione algo corto! y GRACIAS por responder no creia que m responderias y asi lo guardo en la db "~/Archivos/Editor02-03-2015.html"
Hola. oye quise ejecutar el programa en Visual Studio 2013 pero me manda muchos errores, no se puede ejecutar en ese Visual Studio??
ResponderEliminarhola Johana
ResponderEliminar-podrias mencionarme algun mensaje de error que recibes ?
-son errores cuando compilas o cuando ejecutas ?
-tienes inciado el servicio de sql server en la pc donde desarrollas?
saludos
Hola de nuevo mira me manda muchos errores y si el servicio de sql server (2012 express).
ResponderEliminarTHE NAMESPACE ¨Guardar archivoBaseDatos.GuardarArchivo already contains a definition for httpImageHandler¨´
THE NAMESPACE ¨Guardar archivosBaseDatos already contains a definition for Archivo
ambiguity between GuardarArchivosBaseDatos.Archivo.ContenidoArchivo and GuardarArchivoBaseDatos.Archivo.ContenidoArchivo
como esos me aparecen muchos errores, si me urge y otra pregunta lo que estoy buscando es crear carpetas donde pueda subir archivos que se guarden en la base de datos en conclusión así como entrar a mis documentos de windows que los usuarios crean carpetas y guardan archivos y les pueden cambiar el nombre eso es lo que estoy buscando pero en asp.net con c# NO SE SI TENGAS ALGO O puedas ayudarme?
te lo agradezco ! saludos
hola Johana
ResponderEliminarla verdad es muy raro a mi me dejo migrar sin problema
en onedrive subi el zip con la migracion, ingresa en al descarga
saludos
me sale un error
ResponderEliminarError de servidor en la aplicación '/'.
No se encuentra el recurso.
Descripción: HTTP 404. El recurso que está buscando (o una de sus dependencias) se puede haber quitado, haber cambiado de nombre o no estar disponible temporalmente. Revise la dirección URL siguiente y asegúrese de que está escrita correctamente.
Dirección URL solicitada: /DescargaArchivo.ashx
Información de versión: Versión de Microsoft .NET Framework:2.0.50727.6421; Versión ASP.NET:2.0.50727.6427
hola
Eliminarconfiguraste el handler en el web.config ? sino lo defines alli no lo va a encontrar
saludos
si lo realice en el web config, y me sigue saliendo el mismo error otra pergunta tengo un problema estoy haciendo una aplicación en web y quiero saber como hacerle para guardar el nombre de alrchivo ya sea pdf o word para despues poderlo visualizarlo tengo una base de datos en sql server y alli guardo los datos pero como lo podria hacer espero y me puedas ayudar gracias
ResponderEliminarhola
Eliminarpara grabar el nombre podrias usar la propiedad FileName del FileUpload, ese dato lo usarias para registrar en la db y el SaveAs() para grabarlo una carpeta dentro del sitio web
La idea es que el carpeta que definas donde ubicar los archivos sea fija o definida en el config, pero es algo que puedas determinar con el Server.MapPath()
enviarias el archivo usando el Response.TransferFile() indicando al ruta fisica del archivos
saludos
protected void BtnGuardar_Click(object sender, EventArgs e)
ResponderEliminar{
try
{
//bool resultado = ValidarControl();
Ioficios = new Oficios(conexion, this);
if (Session["Accion"].ToString() == "A")
{
FuCargarArchivo.SaveAs(MapPath("~/Archivos" + FuCargarArchivo.FileName.ToString()));
LMensaExito.Text = "EL archivo:" + FuCargarArchivo.FileName.ToString() + "Se cargo con exito en el servidor";
//oIngenieros.PKID = Convert.ToInt32(this.TxtCodigo.Text);
Ioficios.NombreArchivo = FuCargarArchivo.FileName.ToString();
Ioficios.Asunto = TxtAsunto.Text;
Ioficios.FKIDdireccion = Convert.ToInt32(DDLDireccion.SelectedValue);
Ioficios.Responsable = TxtResponsable.Text;
Ioficios.Asignado = TxtAsignado.Text;
Ioficios.Dirigido = TxtDirigido.Text;
Ioficios.Noficio = TxtNoOficio.Text;
Ioficios.Folio = Convert.ToInt32(TxtFolio.Text);
Ioficios.FKIDdependencia = Convert.ToInt32(DDLDependencia.SelectedValue);
Ioficios.Firmado = TxtFirmado.Text;
Ioficios.Prioridad = DDLPrioridad.Text;
Ioficios.FKIDdepartamento = Convert.ToInt16(DDLCategoria.SelectedValue);
Ioficios.Estado = DDLEstado.Text;
Ioficios.Adquisiciones = DDLAdquisiones.Text;
Ioficios.FechaOficio = TxtFechaOficio.Text;
Ioficios.Fechasello = TxtFechaSello.Text;
Ioficios.Fecharespondido = TxtFechaRespondido.Text;
Ioficios.Comentarios = TxtComentarios.Text;
Ioficios.UPSERT();
Session["Accion"] = null;
Response.Redirect("~/FrmBackEnd_CatOficios.aspx");
}
MIRA ESTE ES MI CODIGO QUE UTILIZO NO SE SI SE ENCUENTRE BIEN O QUE HICE MAL ESPERO Y ME PUEDAS AYUDAR ESE FUGARARCHIVO ES MI FILEUPLOAD
ResponderEliminarprivate void llenarTabla()
ResponderEliminar{
Ioficios = new Oficios(conexion, this);
DataSet dsgrid = Ioficios.SELECT();
if (dsgrid.Tables.Count != 0 && dsgrid.Tables[0].Rows.Count != 0)
{
using (dsgrid)
{
if (dsgrid.Tables[0].DefaultView.Count > 0)
{
dgvBusquedas.DataSource = dsgrid.Tables[0];
dgvBusquedas.DataBind();
DirectoryInfo dirInfo = new DirectoryInfo(Server.MapPath("~/Archivos/"));
//C:\Users\esner.perez\Source\Workspaces\DGTI.SERVIDORES\dgti.intranet\DGTI.Intranet\Archivos\
FileInfo[] fileInfo = dirInfo.GetFiles("*.*", SearchOption.AllDirectories);
dgvBusquedas.UseAccessibleHeader = true;
dgvBusquedas.HeaderRow.TableSection = TableRowSection.TableHeader;
TableCellCollection Celdas = dgvBusquedas.HeaderRow.Cells;
Celdas[1].Attributes.Add("data-class", "expand");
Celdas[2].Attributes.Add("data-sort-initial", "true");
Celdas[3].Attributes.Add("data-hide", "phone,tablet");
Celdas[4].Attributes.Add("data-hide", "phoe,table");
NoRegistros = dsgrid.Tables[0].Rows.Count;
}
}
}
este es mi codigo para llenar el grid no se si me puedas ayudar como lo visualizaria, gracias por tu ayuda
hola
Eliminarveo que haces un dirInfo.GetFiles() pero la lista de archivos donde la usas ?
ademas porque no usas un GridView que es mas simple para asignar los datos
entiendo que subes un archivo y registras un oficio, pero cuando cargas la tabla no deberias recuperar de la tabla de la db esos oficios en lugar de obtener una lista de archivos?
saludos
Hola.. por favor ayúdame..
ResponderEliminarNo se como solucionar el problema.
Tengo todo tal como tu lo tienes es mas corro el aplicativo tuyo.
pero sale este error.
Error de servidor en la aplicación '/'.
No se encuentra el recurso.
Descripción: HTTP 404. El recurso que está buscando (o una de sus dependencias) se puede haber quitado, haber cambiado de nombre o no estar disponible temporalmente. Revise la dirección URL siguiente y asegúrese de que está escrita correctamente.
Dirección URL solicitada: /DescargaArchivo.ashx
Información de versión: Versión de Microsoft .NET Framework:2.0.50727.5483; Versión ASP.NET:2.0.50727.5491
tiienes que poner el handler en el web config
EliminarHestoy teniendo problemas con agarrarle la mano al c# con active directory, alguien posee algun ejemplo de alguna funcion que busque un usuario en Active Directory y me traiga su nombre y apellido, mail, telefono y si es valido el nombre de usuario?
ResponderEliminarleandro me puedes ayudar con esto
hola
Eliminaraqui
Howto: (Almost) Everything In Active Directory via C#
tienes un ejemplo de como poder consultar AD y tomar los datos del usuario
saludos
Muy bueno.
ResponderEliminarTambién ejemplos básicos: http://tupagina.comuf.com/
Hola Leandro muy buen tutorial, por favor podrías volver a subir el script de la base de datos, tengo problemas al abrirlo.
ResponderEliminarLeandro gracias por tu información me ayuda bastante.
ResponderEliminarmi pregunta es la siguiente, me sale este siguen error, cuando ejecuto.
"Mensaje de error del analizador: No se pudo cargar el tipo 'GuardarArchivoBaseDatos.GuardarArchivo.HttpImageHandler'."
Error de código fuente:
"Línea 63: "
Línea 64:
"Línea 65: "
Línea 66:
"Línea 67: "
Error de código fuente:
ResponderEliminarLínea 63: add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/
Línea 64:
Línea 65: add verb="*" path="*.ashx" type="GuardarArchivoBaseDatos.GuardarArchivo.HttpImageHandler"/
Línea 66:
Línea 67: /httpHandlers
hola
EliminarEse mensaje se produce porque el handler parece que no responde o no esta configurado
verifica el web.config para ver si tienes definido el handler que menciona el error
saludos
Hola Leandro, ejecute tu codigo en vb 2012 me va de maravilla con el sql que tengo, pero quiero aplicar esta logica en un servidor, es cuando voy al web.config y en la cadena le indico pero me indica que el attachdbfilename incorrecto, aparte que cuando hago el backup con el .mdf en el sql del servidor este no lo reconoce con el nombre de Archivos, sino que le coloca el nombre de la ruta donde descargue tu proyecto, podrías ayudarme? te estare agradecido con esta consulta.
ResponderEliminarluego del indico iba esta linea de codigo: add name="default" connectionString="Data Source=servidor;User ID=user;Password=pass; AttachDbFilename=|DataDirectory|\Archivos.mdf;User Instance=true;" pero al parecer no me dejaron publicarla
EliminarHola Leandro, una duda de que manera podría cargar los archivos a diferentes paginas (categorias) de acuerdo a el tema.
ResponderEliminarPor ejemplo: Subir documentos relacionados a la "naturaleza" a una pagina llamada "La naturaleza"
Me podrias apoyar? gracias.
hola
EliminarEntiendo que estos archivos estan en una base de datos, no ?
Si es asi podrias recuperarlos definiendo un WHERE que filtre por esa categoria que define cada pagina.
Lo que no entendi es lo de subir documento relacionados, o sea salvo que el documento tenga alguna forma de validar si es de esa categoria, no veo como podrias limitarlo, es mas bien una accion que el cliente debe conocer y subir lo que corresponden
saludos
hola Leandro tienes este ejemplo para una aplicación en Windows forms?
ResponderEliminarhola
EliminarPero en winform seria aun mas simple, solo cambiaria la forma en que tomas el archivo, usarias el OpenFileDialog para que el asuario lo seleccione y luego el File.ReadAllBytes() para obtener el byte[] que usarias en el insert. La persistencia seria exactamente igual.
saludos
Hola Leandro. Implementé el ejemplo con algunos cambios y al principio me daba algunos errores. Ahora se abre la página Download.aspx con el índice de la fila respectiva, pero queda en blanco, no se abre ningún documento!!! Tengo unas dudas en el archivo Download.aspx.vb. En el se ve Imports GuardarArchivoBaseDatos y Namespace GuardarEnDb. No sé cómo implementarlas aunque las veo en el ejemplo. Tal vez me puedas ayudar. Gracias
ResponderEliminarhola
EliminarPuede que este generandose un fallo cuando recuperas el documento y lo envias en el response, defines algun try..catch en el codigo
saludos
Hola Estimado tengo una consulta estoy usando response pero envio la ruta ejemplo,
ResponderEliminarP:\20131529181\Retencion\20-20160701\ENVIAR\20131529181-20-RP01-00001.xml
y me descarga el archivo pero con el contenido de la pagina no el archivo que apunto espero que me ayudes gracias.
Hola, se podra hacer todo esto mismo en java?? lo necesito para implementación en jsp, javascript, servlet´s y ajax....
ResponderEliminarBuenas saludos
ResponderEliminartengo un inconveniente con pdf necesito abrir un archivo pdf y guardarlo en sqlserver a traves de C# logro guardar el documento pdf pero no logro mostrarlo agradeceria su ayuda
de esta manera inicio el openfial y guardo el archivo pdf
public partial class Scanner : Form
{
public byte[] Transformador { get; private set; }
public Scanner()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
try
{
SqlCommand sql = new SqlCommand();
Dato.Conexion conexion = new Conexion();
conexion.conecta();
sql.Connection = conexion.conexion;
sql.CommandText = "ingresoscanner";
sql.CommandType = CommandType.StoredProcedure;
sql.Parameters.AddWithValue("@Nombre", txtnombre.Text);
sql.Parameters.AddWithValue("@Archivo", Transformador);
SqlDataReader go = sql.ExecuteReader();
go.Close();
conexion.conexion.Close();
MessageBox.Show("Documento Guardado Satisfactoriamente");
}
catch (SqlException )
{
MessageBox.Show("No se Guardo Documento", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void button4_Click(object sender, EventArgs e)
{
try
{
openFileDialog1.ShowDialog();
if (openFileDialog1.FileName.Equals("") == false)
{
archivo.src = openFileDialog1.FileName;
Transformador = System.IO.File.ReadAllBytes(openFileDialog1.FileName);
}
}
catch (Exception ex)
{
MessageBox.Show("No se pudo cargar la imagen: " + ex.ToString());
}
}
para mostrar el documento queda en varbinary la tabla dode se almacena es
create table Scanner
(
id bigint primary key IDENTITY(1,1) NOT NULL,
Nombre varchar(150) NULL,
Archivo varbinary (max) NULL
)
he intentado mostrarla de la siguiente manera
public void verdocumentos(string Nombre, AxAcroPDF PDF, OpenFileDialog openFileDialog )
{
try
{
conexion.Close();
SqlDataAdapter adapter = new SqlDataAdapter("Select Archivo from Scanner where Nombre = '" + Nombre + "'", conexion);
DataSet set = new DataSet();
conecta();
adapter.Fill(set, "Scanner");
byte[] datos = new byte[0];
DataRow row = set.Tables["Scanner"].Rows[0];
datos = (byte[])row["Archivo"];
System.IO.MemoryStream ms = new System.IO.MemoryStream(datos);
PDF.src = openFileDialog.FileName;
}
catch (SqlException)
{
MessageBox.Show("Error Al Cargar La Imagen", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
agradeceria su colaboracion he buscado en internet pero no encuentro respuesta
saludos !!!
¡This post is exelent!
ResponderEliminarThank You Leandro
Regards
Six Years After :V
Algo mas
ResponderEliminar¿Tienes algún tutorial o algún artículo de cómo usar los handler en una solución?
Graias de antemano
Gracias por tan excelente tutorial. Me ha servido en 2 proyectos, en uno los archivos están en una carpeta del sitio y en otro los subo a la base de datos.
ResponderEliminarSaludos Leandro, una consulta, eso puede ser aplicado a un proyecto MVC de asp?
ResponderEliminarHola Leandro, pregunta, como puedo hacer para obtener la ruta de un dispositivo movil concetado a la pc (en este caso un celular) veras lo quiero hacer es escribir un archivo desde la pc en el celular y pienso que lo puedo hacer si obtengo primero la ruta.
ResponderEliminarIntente obtener la ruta pero me resulto lo siguiente:
C:\Users\aromero\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\LCHAD2HD\
cuando esperaba algo como:
Equipo\\ASUS_X00BD\\Almacenamiento interno\\Download\\
para luego como te digo escribir el archivo en esa direccion:
using (StreamWriteroutfile = new StreamWriter("Equipo\\ASUS_X00BD\\Almacenamiento interno\\Download\\" + "demo1.txt", false, Encoding.ASCII))
{
StreamWriteroutfile.WriteLine(01000865 + "Arturo Romero" + "Desarrollo Software" );
}
Gracias por tus comentarios, Saludos
Al subir un archivo como podríamos asegurarnos que no tenga un malware???? Existe algún servicio para poder analizar el archivo antes de subirlo??
ResponderEliminarHola Leandro, los enlaces estan caidos.. Hay alguna otra forma de descargar el ejemplo?
ResponderEliminarHola Leandro! muchas gracias.. no he podido descargar el documento de C# esta bien?
ResponderEliminar