Как предотвратить ошибку «недостаточно памяти» при загрузке файлов с помощью access-VBA? - PullRequest
1 голос
/ 06 марта 2019

Я перебираю папку и пытаюсь загрузить каждый файл в папке в систему управления документами со следующим кодом:

Dim webRequest As MSXML2.XMLHTTP60: Set webRequest = New MSXML2.XMLHTTP60

Call webRequest.Open(HTTPPost, adress, False)

Const Boundary As String = "AaB03x"
Call webRequest.setRequestHeader(HTTPHeaderValueContentType, "multipart/form-data;boundary=" & Boundary)
Call webRequest.setRequestHeader(HTTPHeaderValueCallingApplication, get_sys_db)
Call webRequest.setRequestHeader("Connection", "Keep-Alive")
Call webRequest.setRequestHeader("cache-control", "no-cache")

Dim byteData As Variant
With CreateObject("ADODB.Stream")
    .Type = StreamType.Binary
    .Mode = StreamMode.ReadWrite
    .Open
    Call .LoadFromFile(fileName)
    byteData = .Read  'Somethimes here I get the "out of memory" error
End With

'dim requestData as Variant
With CreateObject("ADODB.Stream")
    .Mode = StreamMode.ReadWrite
    .Charset = WindowsCharset
    .Open
    .Type = StreamType.Text
    Dim uploadFilename As String
    uploadFilename = ZConverter.VariantToString(cut_file(fileName))
    .WriteText CreateContentDisposionText("itemName", uploadFilename, Boundary)  
    .WriteText CreateContentDisposionText("parentNickname", parentNickname, Boundary) 
    .WriteText vbNewLine & "--" & Boundary & vbNewLine & "Content-Disposition: form-data; name=""file""; filename=""" & fileName & """" & vbNewLine 
    .WriteText vbNewLine
    .Position = StreamPositionStart
    .Type = StreamType.Binary
    .Position = .Size
    .Write byteData
    Set byteData = Nothing
    .Position = StreamPositionStart
    .Type = StreamType.Text
    .Position = .Size
    .WriteText vbNewLine & vbNewLine & "--" & Boundary & "--" & vbNewLine
    .Position = StreamPositionStart
    .Type = StreamType.Binary
    Call webRequest.Send(.Read) 'Here I get the "out of memory" error most of the time
End With

Так что это прекрасно работает для небольших файлов.

Но когда я пытаюсь загрузить файл с 420 МБ, я получаю сообщение об ошибке: «Недостаточно памяти для этой задачи» (оригинал: «Für diesen Vorgang ist nicht genügend Speicher verfügbar.»).При открытом VBE (среде разработки) происходит сбой даже при 20 МБ-файлах.

Для доступа требуется ~ 55 МБ ОЗУ с закрытым VBE и 140 МБ с открытым VBE.Поскольку использование памяти всегда возвращается к этим значениям, я не думаю, что произошла утечка памяти.

Итак: есть ли способ расширить доступную оперативную память для доступа, поскольку на компьютере> 3 ГБ свободной оперативной памяти?А если нет, то есть ли способ изменить код, чтобы не нужно было столько памяти сразу?

Обновление: Как я загружаю файл, это результат моего вопроса о переполнении стека: Загрузить pdf через multipart-HTML-Post файл изменений

...