我有一个传统的经典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:吨
我仍然不确定如何解决这个问题。