2013-12-11 60 views
1

我遇到了使用純ASP上傳庫將xlsx文件上傳到sql server的問題。純ASP上傳xlsx文件

它似乎在文件末尾丟失了一個字節。所以,它會導致文件損壞。

請注意,這只是用這種文件的情況發生,任何其他作品沒有問題,並工作多年。

任何線索或猜測此主題?

謝謝!

以下是我使用的類。該方法是savetodatabase

<% 
'*************************************** 
' File: Upload.asp 
' Author: Jacob "Beezle" Gilley 
' Email: [email protected] 
' Date: 12/07/2000 
' Comments: The code for the Upload, CByteString, 
'   CWideString subroutines was originally 
'   written by Philippe Collignon...or so 
'   he claims. Also, I am not responsible 
'   for any ill effects this script may 
'   cause and provide this script "AS IS". 
'   Enjoy! 
'**************************************** 

Class FileUploader 

Public Files 
Private mcolFormElem 

Private Sub Class_Initialize() 
    Set Files = Server.CreateObject("Scripting.Dictionary") 
    Set mcolFormElem = Server.CreateObject("Scripting.Dictionary") 
End Sub 

Private Sub Class_Terminate() 
    If IsObject(Files) Then 
     Files.RemoveAll() 
     Set Files = Nothing 
    End If 
    If IsObject(mcolFormElem) Then 
     mcolFormElem.RemoveAll() 
     Set mcolFormElem = Nothing 
    End If 
End Sub 

Public Property Get Form(sIndex) 
    Form = "" 
    If mcolFormElem.Exists(LCase(sIndex)) Then Form = mcolFormElem.Item(LCase(sIndex)) 
End Property 

Public Default Sub Upload() 
    Dim biData, sInputName 
    Dim nPosBegin, nPosEnd, nPos, vDataBounds, nDataBoundPos 
    Dim nPosFile, nPosBound 

    biData = Request.BinaryRead(Request.TotalBytes) 
    nPosBegin = 1 
    nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13))) 

    If (nPosEnd-nPosBegin) <= 0 Then Exit Sub 

    vDataBounds = MidB(biData, nPosBegin, nPosEnd-nPosBegin) 
    nDataBoundPos = InstrB(1, biData, vDataBounds) 

    Do Until nDataBoundPos = InstrB(biData, vDataBounds & CByteString("--")) 

     nPos = InstrB(nDataBoundPos, biData, CByteString("Content-Disposition")) 
     nPos = InstrB(nPos, biData, CByteString("name=")) 
     nPosBegin = nPos + 6 
     nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(34))) 
     sInputName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin)) 
     nPosFile = InstrB(nDataBoundPos, biData, CByteString("filename=")) 
     nPosBound = InstrB(nPosEnd, biData, vDataBounds) 

     If nPosFile <> 0 And nPosFile < nPosBound Then 
      Dim oUploadFile, sFileName 
      Set oUploadFile = New UploadedFile 

      nPosBegin = nPosFile + 10 
      nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(34))) 
      sFileName = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin)) 
      oUploadFile.FileName = Right(sFileName, Len(sFileName)-InStrRev(sFileName, "\")) 

      nPos = InstrB(nPosEnd, biData, CByteString("Content-Type:")) 
      nPosBegin = nPos + 14 
      nPosEnd = InstrB(nPosBegin, biData, CByteString(Chr(13))) 

      oUploadFile.ContentType = CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin)) 

      nPosBegin = nPosEnd+4 
      nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2 
      oUploadFile.FileData = MidB(biData, nPosBegin, nPosEnd-nPosBegin) 

      If oUploadFile.FileSize > 0 Then Files.Add LCase(sInputName), oUploadFile 
     Else 
      nPos = InstrB(nPos, biData, CByteString(Chr(13))) 
      nPosBegin = nPos + 4 
      nPosEnd = InstrB(nPosBegin, biData, vDataBounds) - 2 
      If Not mcolFormElem.Exists(LCase(sInputName)) Then mcolFormElem.Add LCase(sInputName), CWideString(MidB(biData, nPosBegin, nPosEnd-nPosBegin)) 
     End If 

     nDataBoundPos = InstrB(nDataBoundPos + LenB(vDataBounds), biData, vDataBounds) 
    Loop 
End Sub 

'String to byte string conversion 
Private Function CByteString(sString) 
    Dim nIndex 
    For nIndex = 1 to Len(sString) 
     CByteString = CByteString & ChrB(AscB(Mid(sString,nIndex,1))) 
    Next 
End Function 

'Byte string to string conversion 
Private Function CWideString(bsString) 
    Dim nIndex 
    CWideString ="" 
    For nIndex = 1 to LenB(bsString) 
     CWideString = CWideString & Chr(AscB(MidB(bsString,nIndex,1))) 
    Next 
End Function 
End Class 

Class UploadedFile 

Public ContentType 
Public FileName 
Public FileData 

Public Property Get FileSize() 
    FileSize = LenB(FileData) 
End Property 

Public Sub SaveToDisk(sPath) 
    Dim oFS, oFile 
    Dim nIndex 

    If sPath = "" Or FileName = "" Then Exit Sub 
    If Mid(sPath, Len(sPath)) <> "\" Then sPath = sPath & "\" 

    Set oFS = Server.CreateObject("Scripting.FileSystemObject") 
    If Not oFS.FolderExists(sPath) Then Exit Sub 

    Set oFile = oFS.CreateTextFile(sPath & FileName, True) 

    For nIndex = 1 to LenB(FileData) 
     oFile.Write Chr(AscB(MidB(FileData,nIndex,1))) 
    Next 

    oFile.Close 
End Sub 

Public Sub SaveToDatabase(ByRef oField) 
    If LenB(FileData) = 0 Then Exit Sub 

    If IsObject(oField) Then 
     oField.AppendChunk FileData 
    End If 
End Sub 

End Class 
%> 
+0

應參數nIndex從1去,或0? – Offbeatmammal

回答

1

我有同樣的問題。

在循環下運行少一點時間爲我解決問題。

對於參數nIndex = 1到LENB(的FileData)-1-