Hola,
Tengo el siguiente problema.
Mediante las funciones que a continuación describo, almaceno y leo desde BBDD archivos (sobre un campo image de SQLServer)
Siempre ha funcionado bien, pero ahora me he dado cuenta que con archivos de Office2007 (docx, xlsx, etc) da problemas de apertura.
He descubierto que en BBDD se están almacenando bytes de mas.
¿Alguien ha tenido este problema y lo ha podido solucionar?
Dejo aquí las funciones para su revisión:
Public Function GuardarBinario(ByRef rs As Recordset, Campo As String, archivo As String, Optional BorraArchivo As Boolean) As Integer
' Función que Almacena en Base de datos un archivo binario
' Recibe como parámetros una referencia a un recorset, el campo dónde se almacena
' el archivo que hay que almacenar y si se desea borrar el fichero físico una vez almacenado
' La función devuelve 0 si almacenó correctamente el archivo o 1 si hubo un error
Dim LongitudFichero, i As Long
Dim Porcion As Long
Dim Bloque
Dim varChunk() As Byte
lnNumero = FreeFile
Open archivo For Binary Access Read As lnNumero
' El fichero hay que partirlo en trozos....
LongitudFichero = LOF(lnNumero) ' Longitud de los datos en el archivo
nconst = 102400
If LongitudFichero > 0 Then
Bloque = LongitudFichero nconst
Porcion = LongitudFichero Mod nconst
rs(Campo).AppendChunk Null ' limpiamos el campo por si acaso...
ReDim varChunk(Porcion)
Get lnNumero, , varChunk() ' Tomo un trozo del tamaño necesario
rs(Campo).AppendChunk varChunk()
ReDim varChunk(nconst)
For i = 1 To Bloque ' y ahora los trozos que quedan
Get lnNumero, , varChunk()
rs(Campo).AppendChunk varChunk()
Next i
GuardarBinario = 0
Else
GuardarBinario = 1
End If
Close lnNumero
If BorraArchivo = True Then
Kill archivo
End If
End Function
Public Sub LeerBinario(ByRef rs As Recordset, Campo As String, archivo As String)
' Procedimiento que guarda en disco un archivo binario leido de Base de datos
Dim fl, i As Long
Dim fragment As Long
Dim Chunks
Dim varChunk() As Byte
lnFichero = FreeFile
fl = rs(Campo).ActualSize
If fl > 0 Then
Open Environ("TEMP") + "" + archivo For Binary Access Write As lnFichero
Chunks = fl 102400
fragment = fl Mod 102400
ReDim varChunk(fragment)
varChunk() = rs(Campo).GetChunk(fragment)
Put lnFichero, , varChunk()
For i = 1 To Chunks
ReDim varChunk(102400)
varChunk() = rs(Campo).GetChunk(102400)
Put lnFichero, , varChunk()
Next i
Close lnFichero
End If
End Sub