none
guardar un archivo pdf en el cliente desde la app web. RRS feed

  • Pregunta

  • alguien tiene la manera mas efectiva para permitirle al cliente guardar un archivo que se encuentra en una carpeta de mi aplicación web.?

    de pronto estoy usando este código:

            Dim ruta As String = Server.MapPath("~/archivo/doc.pdf")  

             Dim name As String
             name = "Archivo.pdf"

            Try

                Response.Clear()

                Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", name))
                Response.ContentType = "application/octet-stream"

                Response.WriteFile(ruta)

                Response.End()

    pero guarda dañado el archivo.

    saludos y muchas gracias.

    martes, 13 de marzo de 2018 16:38

Respuestas

  • Hmm, no creo que yo le haya dado un código con FileStream sin la sentencia Using.  Ese es su problema.  El FileStream no se ha cerrado y el archivo está en uso.

    Using fs As New FileStream(nombreArch, FileMode.Create)
        Dim arch As Byte()
        arch = CType(reader("dtcontrato"), Byte())
        fs.Write(arch, 0, arch.Length)
    End Using


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Raul Ulloa martes, 13 de marzo de 2018 17:25
    martes, 13 de marzo de 2018 17:23
    Moderador
  • hola

    esto

    Dim blob As Byte() = ReadBinaryFile(txtcontratro.Text)

    no funciona, el archivo se sube en el FileUpload no se indica nunca en un textbox

    tienes que convertir el byte array que llega en FileUpLoad1 porque no usas el

    FileUpload.FileBytes (Propiedad)

    asignando esto luego al parametro del command

    recuerda que el archivo no esta en el servidor tiene que subirse, si desarrollas local con el VS, cliente y servidor estan en la misma pc, pero que esto no te confunda, el codigo servidor esta en otro sitio, no tendras acceso a una ruta fisica del archivo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 13 de marzo de 2018 18:22
  • El código lo deje de la siguiente manera. Funciona perfectamente

    If FileUpLoad1.HasFile Then
                        Dim blo(FileUpLoad1.FileBytes.Length) As Byte
                        blo = FileUpLoad1.FileBytes
                        Try
                            ' Leer el archivo binario especificado en el control TextBox.
                            '
                            'Dim blob As Byte() = ReadBinaryFile(blo)

                            ' Establecemos una conexión para conectarnos 
                            ' a la base de datos de SQL Server, utilizando
                            ' la seguridad integrada de Windows NT.
                            '
                            Dim cnn As New SqlConnection("Data Source=RAUL;Initial Catalog=RecursosHumanos;Integrated Security=True")

                            Dim cmd As SqlCommand = cnn.CreateCommand()

                            ' Crear la consulta T-SQL para insertar un nuevo registro.
                            ' 
                            cmd.CommandText = "INSERT INTO contrato(Cod,id_estado,fecha_ingreso,sociedad, dtcontrato) VALUES (@id,@estatus,@fecha,@soc, @blob)"

                            ' Añadir el único parámetro de entrada existente.
                            '
                            cmd.Parameters.AddWithValue("@id", Convert.ToInt32(txtcodcontrato.Text))
                            cmd.Parameters.AddWithValue("@estatus", Convert.ToString(txtestatus.Text))
                            cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtfecha.Text))
                            cmd.Parameters.AddWithValue("@soc", Convert.ToString(txtsociedad.Text))

                            ' La función ReadBinaryFile tal cual se encuentra implementada no devolverá un valor Nothing,
                            ' pero muestro cómo especificar un valor NULL al parámetro de entrada si el valor del campo
                            ' binario fuese Nothing. Para insertar un valor NULL, el campo de la tabla lo tiene que permitir.
                            '
                            cmd.Parameters.AddWithValue("@blob", If(blo IsNot Nothing, blo, CObj(DBNull.Value)))

                            cnn.Open()

                            Dim n As Integer = cmd.ExecuteNonQuery()

                            If (n > 0) Then
                                MsgBox("Se ha grabado el documento satisfactoriamente.")

                            Else
                                MsgBox("No se ha guardado ningún documento.")

                            End If

    Gracias. Leandro.

    martes, 13 de marzo de 2018 19:14

Todas las respuestas

  • Pues en escencia luce bien.  Veo un TRY.  ¿Qué dice el CATCH?  Espero no esté en blanco.  Si lo quita, ¿se genera alguna excepción durante la descarga?

    Jose R. MCP
    Code Samples

    martes, 13 de marzo de 2018 16:46
    Moderador
  • me dice que no se puede tener acceso al archivo porque esta siendo utilizado en otro proceso. primero utilizo el código que ud me brindo para mandar el archivo a la carpeta documentos dentro del sitio, luego quiero guardar ese archivo pero me manda ese mensaje: No se puede tener acceso al archivo porque esta siendo utilizado en otro proceso.

    el código completo es este: 

    guardar en carpete dentro del sitio el doc.

     Try
                Dim valor As String = txtidcontrato.Text
                Dim conn As New SqlConnection("Data Source=RAUL;Initial Catalog=RecursosHumanos;Integrated Security=True")
                conn.Open()
                Dim cmd As New SqlCommand("Select dtcontrato From contrato Where id = @id", conn)
                cmd.Parameters.Add("@id", SqlDbType.Int).Value = valor
                Dim reader As SqlDataReader = cmd.ExecuteReader()
                If reader.Read Then
                    Dim nombreArch As String
                    nombreArch = "Documento" & DropDownList1.Text & "" & txtnombre.Text & "" & txtexpediente.Text & ".pdf"
                    nombreArch = System.IO.Path.Combine(Server.MapPath("~/Documentos"), nombreArch)
                    Dim fs As New FileStream(nombreArch, FileMode.Create)
                    Dim arch As Byte()
                    arch = CType(reader("dtcontrato"), Byte())
                    fs.Write(arch, 0, arch.Length)
                    conn.Close()
                    Button2.Enabled = True
                End If

            Catch ex As Exception
                ' MsgBox("No se puede crear el archivo")
            End Try

    y el codigo para guardar en el cliente

    Dim ruta As String = Server.MapPath("~/Documentos/Documento" & DropDownList1.Text & "" & txtnombre.Text & "" & txtexpediente.Text & ".pdf")
            Dim name As String
            name = "Archivo.pdf"
            Try

                Response.Clear()

                Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", name))
                Response.ContentType = "application/octet-stream"
                Response.WriteFile(ruta)
                Response.End()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try

    martes, 13 de marzo de 2018 17:11
  • hola

    >>permitirle al cliente guardar un archivo que se encuentra en una carpeta de mi aplicación web.?

    Pero alli no estas guardando nada, en ese codigo estas descargando un pdf que esta en el servidor a la pc del usuario

    para guardar deberias realizar un upload del pdf, para eso usarias el FileUpload

    si ubicas este control en el aspx podrias seleccionar un pdf que este en la pc del usaurio y subirlo al servidor

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 13 de marzo de 2018 17:11
  • Un saludo Leandro, me gustaría que le eche un vistazo a este código lo utilizo para subir documentos a la base de datos con FileUpLoad pero como soy nuevo en cuanto al entorno web. quiero la opinión de personas especializadas en esto. espero su ayuda.

    tengo este código para seleccionar un documento desde el cliente y almacenarlo en la base de datos.

              If FileUpLoad1.HasFile Then
                        Dim mifichero As System.Web.HttpPostedFile
                        mifichero = FileUpLoad1.PostedFile
                        Dim nombreArchivo As String = FileUpLoad1.FileName
                        Dim path As String = mifichero.FileName
                        txtcontratro.Text = path
                        Try
                            ' Leer el archivo binario especificado en el control TextBox.
                            '
                            Dim blob As Byte() = ReadBinaryFile(txtcontratro.Text)

                            ' Establecemos una conexión para conectarnos 
                            ' a la base de datos de SQL Server, utilizando
                            ' la seguridad integrada de Windows NT.
                            '
                            Dim cnn As New SqlConnection("Data Source=RAUL;Initial Catalog=RecursosHumanos;Integrated Security=True")

                            Dim cmd As SqlCommand = cnn.CreateCommand()

                            ' Crear la consulta T-SQL para insertar un nuevo registro.
                            ' 
                            cmd.CommandText = "INSERT INTO contrato(Cod,id_estado,fecha_ingreso,sociedad, dtcontrato) VALUES (@id,@estatus,@fecha,@soc, @blob)"

                            ' Añadir el único parámetro de entrada existente.
                            '
                            cmd.Parameters.AddWithValue("@id", Convert.ToInt32(txtcodcontrato.Text))
                            cmd.Parameters.AddWithValue("@estatus", Convert.ToString(txtestatus.Text))
                            cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtfecha.Text))
                            cmd.Parameters.AddWithValue("@soc", Convert.ToString(txtsociedad.Text))

                            ' La función ReadBinaryFile tal cual se encuentra implementada no devolverá un valor Nothing,
                            ' pero muestro cómo especificar un valor NULL al parámetro de entrada si el valor del campo
                            ' binario fuese Nothing. Para insertar un valor NULL, el campo de la tabla lo tiene que permitir.
                            '
                            cmd.Parameters.AddWithValue("@blob", If(blob IsNot Nothing, blob, CObj(DBNull.Value)))

                            cnn.Open()

                            Dim n As Integer = cmd.ExecuteNonQuery()

                            If (n > 0) Then
                                MsgBox("Se ha grabado el documento satisfactoriamente.")

                            Else
                                MsgBox("No se ha guardado ningún documento.")

                            End If


                        Catch ex As Exception
                            ' Se ha producido un error.
                            MsgBox(ex.Message)

                        End Try
                    Else
                        MsgBox("Seleccione un Documento Para Guardar")
                    End If

    un saludo.

    martes, 13 de marzo de 2018 17:20
  • Hmm, no creo que yo le haya dado un código con FileStream sin la sentencia Using.  Ese es su problema.  El FileStream no se ha cerrado y el archivo está en uso.

    Using fs As New FileStream(nombreArch, FileMode.Create)
        Dim arch As Byte()
        arch = CType(reader("dtcontrato"), Byte())
        fs.Write(arch, 0, arch.Length)
    End Using


    Jose R. MCP
    Code Samples

    • Marcado como respuesta Raul Ulloa martes, 13 de marzo de 2018 17:25
    martes, 13 de marzo de 2018 17:23
    Moderador
  • muchas gracias, fue mi error cuando adapte el código. esa es la solución. ya funciona. jeje

    saludos! y muchas gracias nuevamente

    martes, 13 de marzo de 2018 17:30
  • hola

    esto

    Dim blob As Byte() = ReadBinaryFile(txtcontratro.Text)

    no funciona, el archivo se sube en el FileUpload no se indica nunca en un textbox

    tienes que convertir el byte array que llega en FileUpLoad1 porque no usas el

    FileUpload.FileBytes (Propiedad)

    asignando esto luego al parametro del command

    recuerda que el archivo no esta en el servidor tiene que subirse, si desarrollas local con el VS, cliente y servidor estan en la misma pc, pero que esto no te confunda, el codigo servidor esta en otro sitio, no tendras acceso a una ruta fisica del archivo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    martes, 13 de marzo de 2018 18:22
  • El código lo deje de la siguiente manera. Funciona perfectamente

    If FileUpLoad1.HasFile Then
                        Dim blo(FileUpLoad1.FileBytes.Length) As Byte
                        blo = FileUpLoad1.FileBytes
                        Try
                            ' Leer el archivo binario especificado en el control TextBox.
                            '
                            'Dim blob As Byte() = ReadBinaryFile(blo)

                            ' Establecemos una conexión para conectarnos 
                            ' a la base de datos de SQL Server, utilizando
                            ' la seguridad integrada de Windows NT.
                            '
                            Dim cnn As New SqlConnection("Data Source=RAUL;Initial Catalog=RecursosHumanos;Integrated Security=True")

                            Dim cmd As SqlCommand = cnn.CreateCommand()

                            ' Crear la consulta T-SQL para insertar un nuevo registro.
                            ' 
                            cmd.CommandText = "INSERT INTO contrato(Cod,id_estado,fecha_ingreso,sociedad, dtcontrato) VALUES (@id,@estatus,@fecha,@soc, @blob)"

                            ' Añadir el único parámetro de entrada existente.
                            '
                            cmd.Parameters.AddWithValue("@id", Convert.ToInt32(txtcodcontrato.Text))
                            cmd.Parameters.AddWithValue("@estatus", Convert.ToString(txtestatus.Text))
                            cmd.Parameters.AddWithValue("@fecha", Convert.ToDateTime(txtfecha.Text))
                            cmd.Parameters.AddWithValue("@soc", Convert.ToString(txtsociedad.Text))

                            ' La función ReadBinaryFile tal cual se encuentra implementada no devolverá un valor Nothing,
                            ' pero muestro cómo especificar un valor NULL al parámetro de entrada si el valor del campo
                            ' binario fuese Nothing. Para insertar un valor NULL, el campo de la tabla lo tiene que permitir.
                            '
                            cmd.Parameters.AddWithValue("@blob", If(blo IsNot Nothing, blo, CObj(DBNull.Value)))

                            cnn.Open()

                            Dim n As Integer = cmd.ExecuteNonQuery()

                            If (n > 0) Then
                                MsgBox("Se ha grabado el documento satisfactoriamente.")

                            Else
                                MsgBox("No se ha guardado ningún documento.")

                            End If

    Gracias. Leandro.

    martes, 13 de marzo de 2018 19:14