Principales respuestas
guardar un archivo pdf en el cliente desde la app web.

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.
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
-
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- Editado Leandro TuttiniMVP martes, 13 de marzo de 2018 18:24
- Marcado como respuesta Raul Ulloa martes, 13 de marzo de 2018 19:14
-
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 IfGracias. Leandro.
- Marcado como respuesta Juan MondragónModerator miércoles, 14 de marzo de 2018 17:21
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 -
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 Tryy 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
-
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 -
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.
-
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
-
-
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- Editado Leandro TuttiniMVP martes, 13 de marzo de 2018 18:24
- Marcado como respuesta Raul Ulloa martes, 13 de marzo de 2018 19:14
-
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 IfGracias. Leandro.
- Marcado como respuesta Juan MondragónModerator miércoles, 14 de marzo de 2018 17:21