读取已发布的二进制文件并写入新的二进制文件

我正在创build一个网页,允许用户上传文件到服务器。

我能够保存在服务器上的文件,但我注意到,办公室文件(如Word,Excel)已损坏,无法打开。

我的用户界面非常简单

<form method="post" enctype="multipart/form-data" action="uploadFile.asp"> <p>Select a file:<br><input type=File size=30 name="file1"></p> <input type=submit value="Upload"> </form> 

在我的uploadFile.asp ,我使用VBScript。 我试图读取和写入二进制数据并直接写入。

 Function SaveBinaryData(FileName, ByteArray) Const adTypeBinary = 1 Const adSaveCreateOverWrite = 2 'Create Stream object Dim BinaryStream Set BinaryStream = CreateObject("ADODB.Stream") 'Specify stream type - we want To save binary data. BinaryStream.Type = adTypeBinary 'Open the stream And write binary data To the object BinaryStream.Open BinaryStream.Write ByteArray 'Save binary data To disk BinaryStream.SaveToFile FileName, adSaveCreateOverWrite End Function Dim biData biData = Request.BinaryRead(Request.TotalBytes) SaveBinaryData "C:\Uploads\ww.xlsx", biData 

就像我之前提到的那样,如果我上传了一个excel或word文件,这个文件就被破坏了。 但是,文本文件将工作得很好。

我尝试了其他我在网上find的解决scheme,比如Pure ASPShadowUploader等,但是找不到一个能正常工作的解决scheme,它们都会导致文件损坏或者根本无法上传。

我怎样才能使它正常工作,以便我可以上传二进制文件,如microsft word或excel?

任何帮助表示赞赏!

我没有看到你的代码如何工作。

传统的ASP没有办法访问像ASP.NET(Request.UploadedFiles)上传的文件,所以如果你不使用COM组件,那么你需要读取Request.BinaryStream并parsing出内容,这并不容易。

有几个经典的ASP脚本这样做,我会build议你使用其中之一。 我用了几个,没有任何问题。 我build议你尝试一下免费的: http : //freevbcode.com/ShowCode.asp?ID=4596

表格

 <form method="post" action="post.asp" enctype="multipart/form-data"> <input type='file' name='blob' size='80' /> </form> 

然后是post.asp的代码。 首先是asp二进制代码:

 Dim folder folder = "public" Response.Expires=0 Response.Buffer = TRUE Response.Clear Sub BuildUploadRequest(RequestBin) PosBeg = 1 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13))) boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg) boundaryPos = InstrB(1,RequestBin,boundary) Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--"))) Dim UploadControl Set UploadControl = CreateObject("Scripting.Dictionary") 'Get an object name Pos = InstrB(BoundaryPos,RequestBin,getByteString("Content-Disposition")) Pos = InstrB(Pos,RequestBin,getByteString("name=")) PosBeg = Pos+6 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34))) Name = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) PosFile = InstrB(BoundaryPos,RequestBin,getByteString("filename=")) PosBound = InstrB(PosEnd,RequestBin,boundary) If PosFile<>0 AND (PosFile<PosBound) Then PosBeg = PosFile + 10 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(34))) FileName = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) nomefile=filename UploadControl.Add "FileName", FileName Pos = InstrB(PosEnd,RequestBin,getByteString("Content-Type:")) PosBeg = Pos+14 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13))) ContentType = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) UploadControl.Add "ContentType",ContentType PosBeg = PosEnd+4 PosEnd = InstrB(PosBeg,RequestBin,boundary)-2 Value = MidB(RequestBin,PosBeg,PosEnd-PosBeg) Else Pos = InstrB(Pos,RequestBin,getByteString(chr(13))) PosBeg = Pos+4 PosEnd = InstrB(PosBeg,RequestBin,boundary)-2 Value = getString(MidB(RequestBin,PosBeg,PosEnd-PosBeg)) End If UploadControl.Add "Value" , Value UploadRequest.Add name, UploadControl BoundaryPos=InstrB(BoundaryPos+LenB(boundary),RequestBin,boundary) Loop End Sub Function getByteString(StringStr) For i = 1 to Len(StringStr) char = Mid(StringStr,i,1) getByteString = getByteString & chrB(AscB(char)) Next End Function Function getString(StringBin) getString ="" For intCount = 1 to LenB(StringBin) getString = getString & chr(AscB(MidB(StringBin,intCount,1))) Next End Function byteCount = Request.TotalBytes RequestBin = Request.BinaryRead(byteCount) Dim UploadRequest Set UploadRequest = CreateObject("Scripting.Dictionary") BuildUploadRequest RequestBin 

然后从代码request.item的forms

 blob = UploadRequest.Item("blob").Item("Value") 

最后把代码保存在服务器上。 我重命名名称的文件不重复的名称,我创build一个univoque名称混合的date和时间。

 contentType = UploadRequest.Item("blob").Item("ContentType") filepathname = UploadRequest.Item("blob").Item("FileName") filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\")) value = UploadRequest.Item("blob").Item("Value") Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject") arrayFile = split(filename,".") estensioneFile = arrayFile(UBound(ArrayFile)) namefileuploaded = day(date())& month(date()) & year(date())& hour(time())&minute(time())& second(time())&"a."&estensioneFile Set MyFile = ScriptObject.CreateTextFile(Server.mappath(folder)&"\"& namefileuploaded) For i = 1 to LenB(value) MyFile.Write chr(AscB(MidB(value,i,1))) Next MyFile.Close