domingo, 13 de marzo de 2011

[ASP.NET] Grabar Archivo en base de datos

 

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] 
 

184 comentarios:

  1. Hola Leo!
    Te 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!!!

    ResponderEliminar
  2. Algo mas...
    cual 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

    ResponderEliminar
  3. hola ×LiZzY MeNdiViL×

    El 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

    ResponderEliminar
  4. hola

    al 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

    ResponderEliminar
  5. 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.

    ResponderEliminar
  6. que pena, y otra pregunta,
    Probando y haciendo debug, cuando trato de subir un archivo mayor a 4MB me aparece la odiosa página azul <>... ¿por que puede ser?

    ResponderEliminar
  7. hola fealso84

    hasta 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

    ResponderEliminar
  8. UFFF.... Leandro... eres grande... muchas gracias!!!!

    ResponderEliminar
  9. Hola 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??

    Gracias

    ResponderEliminar
  10. hola Alexandra

    He 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.

    ResponderEliminar
  11. 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.

    ResponderEliminar
  12. hola fealso84

    bien, 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

    ResponderEliminar
  13. Que tal Leandro,

    En 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.

    ResponderEliminar
  14. Ya lo solucioné, tan solo tenia que dejar la linea asi:

    Gracias!

    ResponderEliminar
  15. hola Miguel

    Bueno me alegro que sea util el articulo y hayas posido solucionar el problema

    saludos

    ResponderEliminar
  16. Hola Leandro

    Tengo 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

    ResponderEliminar
  17. hola Mauro

    estas 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

    ResponderEliminar
  18. Hola Leandro!
    Correcto, 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.

    ResponderEliminar
  19. hola Mauro

    Has 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

    ResponderEliminar
  20. Hola Leandro!
    Si 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

    ResponderEliminar
  21. Leandro mil gracias por su colaboracion! Será pensar entonces en otra opcion...que lastima

    De nuevo mil gracias por su tiempo

    Saludos desde Medellin, Colombia

    ResponderEliminar
  22. Hola Leandro, tengo una consulta, tengo un problema para crear un log en aspenet, como podria hacerlo..

    ResponderEliminar
  23. Hola, 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..
    gracias

    ResponderEliminar
  24. hola Carlos

    cuando 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

    ResponderEliminar
  25. Hola 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

    ResponderEliminar
  26. 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"
    ) y la fecha de inicio fecha fin de solicitud. algun ejemplo pero con la arquitectura de N CAPAS para web service.

    ResponderEliminar
  27. hola Kely

    pero 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

    ResponderEliminar
  28. 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 =).

    ResponderEliminar
  29. Hola Leandro yo requiero una ayudita en asp.net web services quiero decir para pagina web cliente y servidor
    Veras 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.

    ResponderEliminar
  30. hola

    habias 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

    ResponderEliminar
  31. 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,
    pero 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.

    ResponderEliminar
  32. hola sadako

    primeramente 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

    ResponderEliminar
  33. hola sadako

    para 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

    ResponderEliminar
  34. gracias por tu buen aporte leando
    queria 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

    ResponderEliminar
  35. hola edgar

    de 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

    ResponderEliminar
  36. Felicidades por tus publicaciones Leandro!

    ResponderEliminar
  37. Buenas tardes Leonardo. Cordial Saludo.
    Te 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

    ResponderEliminar
  38. hola Orlando

    no 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

    ResponderEliminar
  39. 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;

    Dim 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

    ResponderEliminar
  40. hola fealso84

    pero 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

    ResponderEliminar
  41. Hola Leandro. pues ya revisé y me decidí a trabajar todo sobre la base de datos.
    Ahora 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

    ResponderEliminar
  42. hola fealso84

    la 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

    ResponderEliminar
  43. 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.

    Gracias.

    ResponderEliminar
  44. hola fealso84

    si 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

    ResponderEliminar
  45. 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

    ResponderEliminar
  46. hola fealso84

    de 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

    ResponderEliminar
  47. 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.

    ResponderEliminar
  48. hola

    viendo 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

    ResponderEliminar
  49. 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.

    ResponderEliminar
  50. La 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.

    ResponderEliminar
  51. hola Daniel

    podrias 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

    ResponderEliminar
  52. hola Daniel

    embeber 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

    ResponderEliminar
  53. 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.

    ResponderEliminar
  54. HOLA LEANDRO..
    EN 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???

    ResponderEliminar
  55. 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.

    ResponderEliminar
  56. hola MPG Motors

    lo 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

    ResponderEliminar
  57. 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.

    ResponderEliminar
  58. hola Boss

    lo 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

    ResponderEliminar
  59. Hola Leandro estoy conectando SQl Server 2008 con .Net ASP C#.
    Si 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!

    ResponderEliminar
  60. hola Boss

    no 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

    ResponderEliminar
  61. 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.

    Saludos y gracias por tus aportaciones tan valiosas!!
    Yanin

    ResponderEliminar
  62. hola Yanin

    aqui

    [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

    ResponderEliminar
  63. Muchas gracias Leandro, eres muy amable lo voy a revisar para aplicarlo.

    Saludos!!

    ResponderEliminar
  64. el código me sirve en visual studio 2010??

    ResponderEliminar
  65. Leandro 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....

    ResponderEliminar
  66. hola Manuel

    si 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

    ResponderEliminar
  67. Muchas gracias leandro por tu ayuda, ahora me dispondré a intentarlo, haber que tal queda...

    ResponderEliminar
  68. Por 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:
    Namespace GuardarEnCarpeta
    End Namespace
    En realidad no se que se signifique eso, pero lo importante es que quedo, Muchas Gracias Leandro.....

    ResponderEliminar
  69. hola Manuel

    el 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

    ResponderEliminar
  70. 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?

    ResponderEliminar
  71. hola jonathan

    para 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

    ResponderEliminar
  72. 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.
    no se que pueda ser....

    ResponderEliminar
  73. hola yonathan

    no 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

    ResponderEliminar
  74. 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!


    Saludos,
    Iván

    ResponderEliminar
  75. hola Iván

    si 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

    ResponderEliminar
  76. Lauro, en el Hyperlink de mi gridview tengo el siguiente codigo html

    <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.

    ResponderEliminar
  77. hola Iván

    a 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

    ResponderEliminar
  78. 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.

    Lo 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 !

    ResponderEliminar
  79. hola Iván

    algo 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

    ResponderEliminar
  80. hola una Consultita
    estoy 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

    ResponderEliminar
  81. al ejecutar me sale el siguiente error
    Error 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...

    ResponderEliminar
  82. hola una Consultita
    estoy 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

    ResponderEliminar
  83. hola Naty

    de casualidad en la pagina has puesto el control ToolkitScriptManager

    Comenzando con ASP.NET AJAX Control Toolkit

    saludos

    ResponderEliminar
  84. 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...

    ResponderEliminar
  85. me sigue saliendo el mismo error
    agregue a la pagina Maestra un ScrptManagementy a otra opagina el ScriptManagementProxy pero sigo con el mismo error ayudaaaa, que estoy haciendo mal...

    ResponderEliminar
  86. hola Naty

    estas 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

    ResponderEliminar
  87. Señor Leandro como siempre sus aportes y conocimiento INVALUABLES

    ResponderEliminar
  88. Señor Leandro como siempre sus aportes y conocimiento INVALUABLES

    ResponderEliminar
  89. Señor Leandro como siempre sus aportes y conocimiento INVALUABLES

    ResponderEliminar
  90. Modifique 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?

    ResponderEliminar
  91. hola Dionisio

    por 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

    ResponderEliminar
  92. 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.

    ResponderEliminar
  93. buenos dias una pregunta como puedo hacer para cuando abra el pdf lo visualize en una nueva ventana??

    ResponderEliminar
  94. hola beto

    no 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

    ResponderEliminar
  95. Que Tal Leandro primeramente Muy Buenos Tus Aportes...
    Tengo 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.

    ResponderEliminar
  96. hola Cristhian

    estas 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

    ResponderEliminar
  97. 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

    ResponderEliminar
  98. hola Daniel

    a 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

    ResponderEliminar
  99. 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.

    ResponderEliminar
  100. Hola Leandro.
    Quisiera 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

    ResponderEliminar
  101. hola david

    poder 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

    ResponderEliminar
  102. Gracias Leandro.
    Si 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?

    ResponderEliminar
  103. hola david

    la 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

    ResponderEliminar
  104. 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.
    Mi 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

    ResponderEliminar
  105. hola david

    que 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

    ResponderEliminar
  106. 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?

    ResponderEliminar
  107. hola david

    pero 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

    ResponderEliminar
  108. 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.
    Ya 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

    ResponderEliminar
  109. hola david

    pues 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

    ResponderEliminar
  110. 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)"
    y 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.

    ResponderEliminar
  111. en el aspx tengo un hyperlink con esto NavigateUrl="\\SERVIDOR\FolderCompartido\Documentos.exe

    ResponderEliminar
  112. hola david

    pero 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

    ResponderEliminar
  113. 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?

    Me recomiendas manejarlas por separado?

    ResponderEliminar
  114. hola david

    hasta 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

    ResponderEliminar
  115. 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.

    ResponderEliminar
  116. hola JAVIER

    es 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

    ResponderEliminar
  117. 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?.
    Muchas gracias!

    ResponderEliminar
  118. hola Jack

    eso 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

    ResponderEliminar
  119. 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:
    cmd.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!!

    ResponderEliminar
  120. hola Jack

    la 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

    ResponderEliminar
  121. 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.

    ResponderEliminar
  122. hola Marco

    ya esta actualizado

    saludos

    ResponderEliminar
  123. Hola Leandro,

    excelente 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.

    ResponderEliminar
  124. 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.

    saludos/gracias...

    ResponderEliminar
  125. se me fue contarle que estoy trabajando con vb.net 2008 y sql server 2008

    ResponderEliminar
  126. hola Aaron

    defines en el web.config la configuracion del handler ?

    sino configuras el handler la extendion .ashx no la va a reconocer

    saludos

    ResponderEliminar
  127. hola Marco

    la verdad es poca la info que porporcionas del problema

    cuando carga la pagina obtienes algun mensaje de error ?

    saludos

    ResponderEliminar
  128. 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 ****.....
    trato 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.

    ResponderEliminar
  129. Hola Leandro,

    sí, 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

    ResponderEliminar
  130. hola Marco

    ese 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

    ResponderEliminar
  131. hola Aaron

    que 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

    ResponderEliminar
  132. Hola Leandro tengo un problema en el webconfig, pues me sale un mensaje de error en esta línea de código : <
    add 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.

    ResponderEliminar
  133. hola Gerson

    pero 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

    ResponderEliminar
  134. Que tal Leandro,

    Necesito 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...

    ResponderEliminar
  135. Estimado Leandro:
    logré 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.

    ResponderEliminar
  136. hola Nahim

    pero 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

    ResponderEliminar
  137. 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

    ResponderEliminar
  138. hola Horacio

    a 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

    ResponderEliminar
  139. 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

    ResponderEliminar
  140. hola Horacio

    pero 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

    ResponderEliminar
  141. Hola Leandro:
    creo 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"

    ResponderEliminar
  142. Hola. oye quise ejecutar el programa en Visual Studio 2013 pero me manda muchos errores, no se puede ejecutar en ese Visual Studio??

    ResponderEliminar
  143. hola Johana

    -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

    ResponderEliminar
  144. Hola de nuevo mira me manda muchos errores y si el servicio de sql server (2012 express).


    THE 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

    ResponderEliminar
  145. hola Johana

    la verdad es muy raro a mi me dejo migrar sin problema

    en onedrive subi el zip con la migracion, ingresa en al descarga

    saludos

    ResponderEliminar
  146. me sale un 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.6421; Versión ASP.NET:2.0.50727.6427

    ResponderEliminar
    Respuestas
    1. hola

      configuraste el handler en el web.config ? sino lo defines alli no lo va a encontrar


      saludos

      Eliminar
  147. 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

    ResponderEliminar
    Respuestas
    1. hola
      para 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

      Eliminar
  148. protected void BtnGuardar_Click(object sender, EventArgs e)
    {
    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");

    }

    ResponderEliminar
  149. 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

    ResponderEliminar
  150. private void llenarTabla()
    {
    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

    ResponderEliminar
    Respuestas
    1. hola
      veo 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

      Eliminar
  151. Hola.. por favor ayúdame..
    No 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

    ResponderEliminar
  152. Hestoy 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?
    leandro me puedes ayudar con esto

    ResponderEliminar
    Respuestas
    1. hola
      aqui
      Howto: (Almost) Everything In Active Directory via C#
      tienes un ejemplo de como poder consultar AD y tomar los datos del usuario
      saludos

      Eliminar
  153. Muy bueno.
    También ejemplos básicos: http://tupagina.comuf.com/

    ResponderEliminar
  154. Hola Leandro muy buen tutorial, por favor podrías volver a subir el script de la base de datos, tengo problemas al abrirlo.

    ResponderEliminar
  155. Leandro gracias por tu información me ayuda bastante.
    mi 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: "

    ResponderEliminar
  156. Error de código fuente:


    Lí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

    ResponderEliminar
    Respuestas
    1. hola
      Ese 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

      Eliminar
  157. 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.

    ResponderEliminar
    Respuestas
    1. luego 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

      Eliminar
  158. Hola Leandro, una duda de que manera podría cargar los archivos a diferentes paginas (categorias) de acuerdo a el tema.
    Por ejemplo: Subir documentos relacionados a la "naturaleza" a una pagina llamada "La naturaleza"
    Me podrias apoyar? gracias.

    ResponderEliminar
    Respuestas
    1. hola
      Entiendo 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

      Eliminar
  159. hola Leandro tienes este ejemplo para una aplicación en Windows forms?

    ResponderEliminar
    Respuestas
    1. hola
      Pero 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

      Eliminar
  160. 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

    ResponderEliminar
    Respuestas
    1. hola
      Puede que este generandose un fallo cuando recuperas el documento y lo envias en el response, defines algun try..catch en el codigo
      saludos

      Eliminar
  161. Hola Estimado tengo una consulta estoy usando response pero envio la ruta ejemplo,
    P:\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.

    ResponderEliminar
  162. Hola, se podra hacer todo esto mismo en java?? lo necesito para implementación en jsp, javascript, servlet´s y ajax....

    ResponderEliminar
  163. Buenas saludos

    tengo 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 !!!

    ResponderEliminar
  164. ¡This post is exelent!
    Thank You Leandro
    Regards
    Six Years After :V

    ResponderEliminar
  165. Algo mas
    ¿Tienes algún tutorial o algún artículo de cómo usar los handler en una solución?
    Graias de antemano

    ResponderEliminar
  166. 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.

    ResponderEliminar
  167. Saludos Leandro, una consulta, eso puede ser aplicado a un proyecto MVC de asp?

    ResponderEliminar
  168. Hola 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.
    Intente 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

    ResponderEliminar
  169. 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??

    ResponderEliminar
  170. Hola Leandro, los enlaces estan caidos.. Hay alguna otra forma de descargar el ejemplo?

    ResponderEliminar
  171. Hola Leandro! muchas gracias.. no he podido descargar el documento de C# esta bien?

    ResponderEliminar