VBScript + Классический ASP - Ошибка, написав бинарный файл на сервере

Я работаю код приложения в 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, чтобы это решать, но директивный орган, который у меня есть, состоит в том, чтобы пытаться не изменять код, потому что у него есть много попаданий, пересеченных в другой функциональности.

0
задан 06.03.2019, 18:37
1 ответ

Хорошо. В конце концов мы смогли решать инцидент, хотя мы не смогли знать ни из-за 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ГЎ.

0
ответ дан 19.11.2019, 22:31

Теги

Похожие вопросы