上传的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了!~~

解决方案 »

  1.   

    建议测试一下 doc格式试试
      

  2.   

    上面已经说过了,doc的,xls的都可以,就是说office2003格式的都没问题,什么PDF,txt,jpg都没问题,就是office2007的有那样的问题,先说明下,我机子上装了office2007,
    文件对比我也试过了,用winmerge和diffmerge都试过,我是修改把abc.docx改为abc.zip然后解压来做文件夹对比的,因为docx好像做不了对比,但是两者的文件大小都一样,里面的xml也都一样
    而且我试过,直接从本地取一个可以正常读取的.docx的文件,直接用代码的方式转成二进制,然后用binarywrite方法,也是出现一样的问题。。
    希望大家能帮我解决解决谢谢了!!!!!
      

  3.   

    没有office2007........不能帮你试验拉
      

  4.   

    win2007的新格式是用zip压缩技术的,本来就是二进制文件,干嘛还要“转成二进制”
      

  5.   

    win2007的新格式是用zip压缩技术的,刚试了,可以啊
      

  6.   

    我也出现过这个问题,问题出现在你的代码的这个部分:
    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的情况.祝你好运