Я работаю код приложения в ASP Классик старая, что не возможно мигрировать в.Net пока, и одна из функций, которая используется, чтобы пересылать файлы Excel в папку последующего сервера для обработок, неожиданно начала бить козырем эту неделю, более чем девяти лет спустя функционируя без ошибок. Блок, который производит неудачу, - следующий:
VarPathCompleta = ToFolder & "\" & filename
Dim MyFileObject
Set MyFileObject = Server.CreateObject("Scripting.FileSystemObject")
Dim objFile,value,i
Set objFile = MyFileObject.CreateTextFile(VarPathCompleta, true)
value = UploadRequest.Item(ParamObjFile).Item("Value")
For i = 1 to LenB(value)
objFile.Write chr(AscB(MidB(value,i,1)))
Next
objFile.Close
Set objFile = Nothing
Set MyFileObject = Nothing
То, что он делает, достаточно стандартное: Пробеги файл, который был получен в UploadRequest, и это пробегает байт в байт, чтобы это писать в другом, который был создан на сервере. Код сходный с другими, которые я нашел в Вебе, и до настоящего времени оно функционировало хорошо. Ошибка случается, выполнив.Write, но только после обрабатывая первые 16 байт, и в этой точке выстрели в ошибку "Ошибка Microsoft VBScript во время выполнения ошибка '800a0005' Аргумент или призыв не действительный к процедуре", просто так подробно опиши. debuggeado процесс и только я смог определять, что это в момент писания этого 17v-ого байт, так как функции Chr (), AscB () и MidB () функционируют правильно. Также я проверил файлы Excel, которые нужно обрабатывать, и они находятся в прекрасном состоянии. Я искал документацию этого случая в Вебе в течение пяти дней, не находя совсем не сходно, за исключением упоминания ошибок в upload с Классическим ASP после fix Microsoft hace один рожает лет, а следовательно я не думаю, что говорится точно об этом. Даже я жду подтверждение приема восхваления администраторы webserver.
Вкратце: Что может вызывать, что этот метод.Write начал бить козырем в этом обстоятельстве? Какая-то известная сходная ошибка есть?
Поскольку он замечает, мы оцениваем использование ADODB.Stream, чтобы это решать, но директивный орган, который у меня есть, состоит в том, чтобы пытаться не изменять код, потому что у него есть много попаданий, пересеченных в другой функциональности.
Хорошо. В конце концов мы смогли решать инцидент, хотя мы не смогли знать ни из-за quГ© cГіdigo оригинал funcionГі хорошо в течение aГ±os, чтобы не удаваться недавно, ни, как даже возможно, что оно функционировало когда-нибудь... Я объясняю: cГіdigo оригинал tenГ - за объектом решать тему безопасности в веб-приложениях, где в extranet не возможно пересылать прямо (upload) файл во внутреннюю папку Веба. Безопасность, которая обычно используется для этих тем, этому препятствует, и обоснована, что это сделал. mГ©todo использованный он состоит в том, чтобы открывать документ в памяти и потом вновь писать это в папке. Таким образом не @copia, но хранится контент. Сейчас, тема состоит в том, что пересылать текстовый файл - fГЎcil с Scripting. FileSystemObject, потому что estГЎ готовившийся к для того, чтобы обрабатывать текстовые файлы, но не для того, чтобы работать с бинарными файлами. И это драма нашего случая. Просто, cГіdigo использованный JAMГЃS debiГі функционировать. КОГДА БЫ ТО НИ БЫЛО. Но он это сделал из-за какой-то extraГ±a razГіn. Окончательно, soluciГіn состоял в том, чтобы менять ее Scripting. FileSystemObject из-за объекта ADODB.Stream. Но для того, чтобы оно действительно функционировало, что читается в Stream, должно быть написанным как бинарный снова. И для этого требуют одной funciГіn, что это превратил leГ-do в объект, который мог бы писаться, для этого Гєltimo использует одну funciГіn (что я получил в Вебе - видеть здесь ).
Часть 1:
If UploadRequest.Item(ParamObjFile).Item("Value") <> "" Then
contentType = UploadRequest.Item(ParamObjFile).Item("ContentType")
filepathname = UploadRequest.Item(ParamObjFile).Item("FileName")
filename = Right(filepathname,Len(filepathname)-InstrRev(filepathname,"\"))
ToFolder = GetPath() & ParamCarpetaUp
Dim VarPathCompleta
filename = Replace(ParamNombre," ","")
VarPathCompleta = ToFolder & "\" & filename
Const adTypeBinary = 1
Const adSaveCreateOverWrite = 2
Dim objStream, fileObj
Dim value
value = MultiByteToBinary(UploadRequest.Item(ParamObjFile).Item("Value"))
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Open
objStream.Type = adTypeBinary
objStream.Write value
objStream.SaveToFile VarPathCompleta, adSaveCreateOverWrite
objStream.Close
Set objStream = Nothing
End If
Часть 2 (функция)
private Function MultiByteToBinary(MultiByte)
' Esta función convierte una cadena multibyte en un dato binario real data (VT_UI1 | VT_ARRAY)
' Usando recordset
Dim RS, LMultiByte
Const adLongVarBinary = 205
Set RS = CreateObject("ADODB.Recordset")
LMultiByte = LenB(MultiByte)
RS.Fields.Append "mBinary", adLongVarBinary, LMultiByte
RS.Open
RS.AddNew
RS("mBinary").AppendChunk MultiByte & ChrB(0)
RS.Update
MultiByteToBinary = RS("mBinary").GetChunk(LMultiByte)
RS.Close
set RS = nothing
End Function
Надеялась, что ни у кого нет необходимость этой досады..., но а, aquГ - estГЎ.