上传的office 2007的文件,如.docx,.xlsx等,上传后转成二进制格式保存到数据库,下载是用Response.BinaryWrite加载,但是就office2007的文件出问题,其他.txt,.jpg,.doc,.xls.等等就正常显示,就是office2007格式的文件出问题,点连接后直接点打开提示文件格式出错,如果点保存,保存到本地,然后再双击打开,一样的提示文件格式出错。
代码如下:
'code to insert:
Dim intSize As Int64
Dim i As Integer
Dim sql, strDiv, strType As String
Dim imgStream As Stream
Dim colFiles As System.Web.HttpFileCollection
Dim objConn As New SqlConnection(CreateConnectString("(local)", <database name>))
Dim objCmd As New SqlCommand("sp_AddAttachment", objConn)
Dim from As String = hidFrom.Text'code to insert:
objCmd.CommandType = CommandType.StoredProcedure
colFiles = Request.Files
ReDim fileID(colFiles.Count - 1)
intSize = colFiles(i).ContentLength
If intSize > 0 Then
imgStream = colFiles(i).InputStream
Dim imgContent(intSize) As Byte
Dim intStatus As Integer = imgStream.Read(imgContent, 0, intSize)
objCmd.Parameters.Add("@tbl", SqlDbType.VarChar, 10)
objCmd.Parameters("@tbl").Value = from
objCmd.Parameters.Add("@id", SqlDbType.Int)
objCmd.Parameters("@id").Value = hidID.Text
objCmd.Parameters.Add("@fileName", SqlDbType.VarChar, 100)
objCmd.Parameters("@fileName").Value = System.IO.Path.GetFileName(colFiles(i).FileName)
objCmd.Parameters.Add("@type", SqlDbType.VarChar, 100)
objCmd.Parameters("@type").Value = colFiles(i).ContentType
objCmd.Parameters.Add("@attach", SqlDbType.Image)
objCmd.Parameters("@attach").Value = imgContent
objConn.Open()
objCmd.ExecuteNonQuery()
objCmd.Parameters.Clear()
objConn.Close()
End If
'code to retrieve:
Dim sql As String
Dim from As String = Request("from")
Dim id As Integer = Request("id")
Dim objConn As New SqlConnection(CreateConnectString("(local)", "WORSDotNet"))
Dim objCmd As New SqlCommand
Dim objDR As SqlDataReader
sql = "SELECT * FROM tbl" & from & "Attachments WHERE intID = " & id
objCmd.CommandText = sql
objCmd.Connection = objConn
Try
objConn.Open()
objDR = objCmd.ExecuteReader(CommandBehavior.CloseConnection)
Do While (objDR.Read())
Response.Buffer = True
Response.ContentType = objDR.Item("strType")
Response.BinaryWrite(objDR.Item("attachment"))
Loop
Catch ex As SqlException
Response.Write(ex.ToString)
Catch ex As Exception
Response.Write(ex.Message)
Finally
objConn.Close()
End Try
怀疑是不是Response.BinaryWrite的方法不支持office2007的格式??
希望有知道的给个意见,不知道的就试试,看你们会不会也出现这样的问题?网上找不到这方面的解答,外国网址也只有几个这样的问题,但是没有相关的答案,很郁闷。。
100了!~~
代码如下:
'code to insert:
Dim intSize As Int64
Dim i As Integer
Dim sql, strDiv, strType As String
Dim imgStream As Stream
Dim colFiles As System.Web.HttpFileCollection
Dim objConn As New SqlConnection(CreateConnectString("(local)", <database name>))
Dim objCmd As New SqlCommand("sp_AddAttachment", objConn)
Dim from As String = hidFrom.Text'code to insert:
objCmd.CommandType = CommandType.StoredProcedure
colFiles = Request.Files
ReDim fileID(colFiles.Count - 1)
intSize = colFiles(i).ContentLength
If intSize > 0 Then
imgStream = colFiles(i).InputStream
Dim imgContent(intSize) As Byte
Dim intStatus As Integer = imgStream.Read(imgContent, 0, intSize)
objCmd.Parameters.Add("@tbl", SqlDbType.VarChar, 10)
objCmd.Parameters("@tbl").Value = from
objCmd.Parameters.Add("@id", SqlDbType.Int)
objCmd.Parameters("@id").Value = hidID.Text
objCmd.Parameters.Add("@fileName", SqlDbType.VarChar, 100)
objCmd.Parameters("@fileName").Value = System.IO.Path.GetFileName(colFiles(i).FileName)
objCmd.Parameters.Add("@type", SqlDbType.VarChar, 100)
objCmd.Parameters("@type").Value = colFiles(i).ContentType
objCmd.Parameters.Add("@attach", SqlDbType.Image)
objCmd.Parameters("@attach").Value = imgContent
objConn.Open()
objCmd.ExecuteNonQuery()
objCmd.Parameters.Clear()
objConn.Close()
End If
'code to retrieve:
Dim sql As String
Dim from As String = Request("from")
Dim id As Integer = Request("id")
Dim objConn As New SqlConnection(CreateConnectString("(local)", "WORSDotNet"))
Dim objCmd As New SqlCommand
Dim objDR As SqlDataReader
sql = "SELECT * FROM tbl" & from & "Attachments WHERE intID = " & id
objCmd.CommandText = sql
objCmd.Connection = objConn
Try
objConn.Open()
objDR = objCmd.ExecuteReader(CommandBehavior.CloseConnection)
Do While (objDR.Read())
Response.Buffer = True
Response.ContentType = objDR.Item("strType")
Response.BinaryWrite(objDR.Item("attachment"))
Loop
Catch ex As SqlException
Response.Write(ex.ToString)
Catch ex As Exception
Response.Write(ex.Message)
Finally
objConn.Close()
End Try
怀疑是不是Response.BinaryWrite的方法不支持office2007的格式??
希望有知道的给个意见,不知道的就试试,看你们会不会也出现这样的问题?网上找不到这方面的解答,外国网址也只有几个这样的问题,但是没有相关的答案,很郁闷。。
100了!~~
文件对比我也试过了,用winmerge和diffmerge都试过,我是修改把abc.docx改为abc.zip然后解压来做文件夹对比的,因为docx好像做不了对比,但是两者的文件大小都一样,里面的xml也都一样
而且我试过,直接从本地取一个可以正常读取的.docx的文件,直接用代码的方式转成二进制,然后用binarywrite方法,也是出现一样的问题。。
希望大家能帮我解决解决谢谢了!!!!!
If intSize > 0 Then
imgStream = colFiles(i).InputStream
Dim imgContent(intSize) As Byte
Dim intStatus As Integer = imgStream.Read(imgContent, 0, intSize)对于你这种方式下载的文件,其实最后的字节数组并没有装满(即存在null),但仍然写到下载的文件流里去了.你对比2个文件的大小应该可以看出来.你下载后的文档的长度比原文件要长,并且是64的倍数.docx或者xlsx文件格式是zip形式的,估计有对这种情况的合法性验证,导致打开会有错误提示.问题找到了,解决方案就是:处理一下最后一次字节读取,使字符数组不存在null的情况.祝你好运