سؤال

I'm having problem uploading xlsx files to the sql server using the pure asp upload library.

It seems to lost one byte at the end of the file. So, it result in a corrupted file.

Notice that this is happening just with this kind of files, any other works without problem, and was working for years.

Any clue or guess on this topic?

Thanks !

Following is the class I'm using.. the method is 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
%>
هل كانت مفيدة؟

المحلول

I was having the same problem.

Running below loop one less time fixed the problem for me.

For nIndex = 1 to LenB(FileData)-1

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top