无法在'Window'上执行'atob':要解码的字符串未正确编码 - 十六进制不同

时间:2017-12-27 21:17:58

标签: node.js angular asp-classic buffer

我有一个传统的经典asp应用程序,它允许我们上传pdf文件。该文件以十六进制形式保存到MS SQL DB中的图像列中。以下是该列中数据的片段:

0x4A564245526930784C6A634E436957317462573144516F784944416762324A7144516F...

我们现在正在使用node.js作为后端并将angular4作为前端来修改应用程序。作为其中一部分,我们需要能够在新应用程序中下载相同的文件。如果我使用angular4上传相同的文件,那么图像数据如下所示:

0x255044462D312E370D0A25B5B5B5B50D0A312030206F626A0D0A3C3C2F547970652F43...

正如您所看到的,十六进制是完全不同的,我不确定是什么导致了这一点。我试着看一下经典的asp代码,但是它非常古老,并且没有特殊的编码或者正在发生这种情况会导致这种情况。

在Angular4中,我们使用带有change事件的标准输入类型文件控件来捕获文件的内容,然后将其保存到我们的数据库中:

myReader.onloadend = (f) => {
      let image64;
      if (myReader.result.toString()) {
        let base64id = ';base64,';
        image64 = myReader.result.substr(myReader.result.indexOf(base64id) + base64id.length);
      }
      someService.upload(image64);
    }

所以没什么可疯狂的,对吗?现在的问题是我能够下载通过angular fine上传的文件,但不能下载通过经典asp上传的文件。我尝试时收到以下错误:

  

无法在'Window'上执行'atob':要解码的字符串不是   正确编码。

以下是用于通过经典ASP上传文件的代码:

Public Function Load()
    Dim PosBeg, PosEnd, PosFile, PosBound, boundary, boundaryPos, Pos
        Dim Name, Value, FileName, ContentType
        Dim UploadControl

        PosBeg = 1
        PosEnd = InstrB(PosBeg,m_FormRawData,getByteString(chr(13)))
        boundary = MidB(m_FormRawData,PosBeg,PosEnd-PosBeg)
        boundaryPos = InstrB(1,m_FormRawData,boundary)
        'Get all data inside the boundaries
        Do until (boundaryPos=InstrB(m_FormRawData,boundary & getByteString("--")))
      Set UploadControl = Server.CreateObject("Scripting.Dictionary")

            Pos = InstrB(BoundaryPos,m_FormRawData,getByteString("Content-Disposition"))
            Pos = InstrB(Pos,m_FormRawData,getByteString("name="))
            PosBeg = Pos+6
            PosEnd = InstrB(PosBeg,m_FormRawData,getByteString(chr(34)))
            Name = getString(MidB(m_FormRawData,PosBeg,PosEnd-PosBeg))
            PosFile = InstrB(BoundaryPos,m_FormRawData,getByteString("filename="))
            PosBound = InstrB(PosEnd,m_FormRawData,boundary)

            If  PosFile<>0 AND (PosFile<PosBound) Then
                PosBeg = PosFile + 10
                PosEnd =  InstrB(PosBeg,m_FormRawData,getByteString(chr(34)))
                FileName = getString(MidB(m_FormRawData,PosBeg,PosEnd-PosBeg))

                UploadControl.Add "FileName", FileName
                Pos = InstrB(PosEnd,m_FormRawData,getByteString("Content-Type:"))
                PosBeg = Pos+14
                PosEnd = InstrB(PosBeg,m_FormRawData,getByteString(chr(13)))

                ContentType = getString(MidB(m_FormRawData,PosBeg,PosEnd-PosBeg))
                UploadControl.Add "ContentType",ContentType

                PosBeg = PosEnd+4
                PosEnd = InstrB(PosBeg,m_FormRawData,boundary)-2
                Value = MidB(m_FormRawData,PosBeg,PosEnd-PosBeg)

                UploadControl.Add "value" , Value

                m_dicFileData.Add LCase(name), UploadControl
            Else
                Pos = InstrB(Pos,m_FormRawData,getByteString(chr(13)))
                PosBeg = Pos+4
                PosEnd = InstrB(PosBeg,m_FormRawData,boundary)-2
                Value = getString(MidB(m_FormRawData,PosBeg,PosEnd-PosBeg))

                UploadControl.Add "value" , Value   
            End If

            m_dicForm.Add LCase(name), UploadControl

            BoundaryPos=InstrB(BoundaryPos+LenB(boundary),m_FormRawData,boundary)
        Loop

        Load = m_blnSucceed
    End Function

知道我能在这做什么来解决这个问题吗?我也需要能够下载旧文件。是否有编码或其他我在这里缺少的东西?

在进一步研究之后,似乎以下是导致错误:Node.js将向前端发送缓冲区。在前端我然后使用以下代码将缓冲区转换为base64:

  _arrayBufferToBase64(buffer) {
    let base64 = '';
    let bytes = new Uint8Array(buffer);
    let len = bytes.byteLength;
    for (let i = 0; i < len; i++) {
      bbase64 += String.fromCharCode(bytes[i]);
    }
    return base64;
  }

来自旧经典asp的返回的base64作为垃圾返回,如下所示:

  

* R {£ÌõGpÃì@j¾é&gt;i¿êAlÄð!! H!u!¡!Î!û“'”U“”¯“Ý#   (?(Q(¢(O))8)k))的d的 5 * H Ï++ 6 + I ++Ñ,, 9中,n,¢,× - '' I'z “«'U(   3F33¸3ñ4+4e44Ø55M55Â5ý676r6®6é7$ 7`77×88P88È99B99¼9ù:6:吨

我仍然不确定如何解决这个问题。

0 个答案:

没有答案