纯ASP上传xlsx文件

时间:2013-12-11 20:31:51

标签: file-upload vbscript asp-classic xlsx

我在使用纯asp上传库将xlsx文件上传到sql server时遇到问题。

它似乎在文件末尾丢失了一个字节。因此,它会导致文件损坏。

请注意,这种情况只发生在这类文件中,其他任何工作都没有问题,而且工作了很多年。

有关此主题的任何线索或猜测?

谢谢!

以下是我正在使用的类..方法是savetodatabase

<%
'***************************************
' File:   Upload.asp
' Author: Jacob "Beezle" Gilley
' Email:  avis7@airmail.net
' 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
%>

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。

在循环下运行一次,为我解决了问题。

  

对于nIndex = 1到LenB(FileData)-1