简体   繁体   中英

VBA post request error - multipart/form-data

I am trying to make a POST request on a website in order to upload an Excel file. When I do it manually (manually browsing a file in a file input html element) and capture the network traffic, the following message appears on fiddler:

Host: electool.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: */*
Accept-Language: es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------8432274816859
Content-Length: 35577
DNT: 1
Connection: keep-alive
Referer: https://electool.com/sourcingtool/pageflowViews/tender_view/action.html?pageflow=tender_view:-2
Cookie: JSESSIONID=87C7F4550EFBDF7A8D6F94C2D021CBB5; electool_sso=5A7A319313EA0EF4

-----------------------------8432274816859
Content-Disposition: form-data; name="qId"

1
-----------------------------8432274816859
Content-Disposition: form-data; name="attachment_1"; filename="A_aFRR negatív_QWERTY00_W38.xlsx"
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
..."

I'd like to do the same with excel vba (selecting the file and posting the same message in order to upload the excel file)

The code I have now:

    For i = 1 To ie.Manage.Cookies.Count
     myCookie = myCookie & ie.Manage.Cookies.Item(i).Name & "=" & ie.Manage.Cookies.Item(i).Value & "; "
    Next
    myCookie = Left(myCookie, Len(myCookie) - 2)
    Dim strBoundary As String
    strBoundary = "-----------------------------501911906621"

    myURL2 = "https://electool.com/sourcingtool/participant/ajaxSaveAttachment.htm"
    sPayLoad = strBoundary & vbNewLine & _
      "Content-Disposition: form-data; name=""qId""" & vbNewLine & vbNewLine & _
      "1" & vbNewLine & strBoundary & vbNewLine & _
      "Content-Disposition: form-data; name=""attachment_1"";filename=""E_W_37_negativ.xlsx""" & _
      vbNewLine & "Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" & _
      vbNewLine & vbNewLine

    sPayLoad = sPayLoad & GetFile(myFile) & strBoundary

    With CreateObject("Msxml2.ServerXMLHTTP.6.0")
        .Open "POST", myURL2, False
        .setRequestHeader "Content-Type", "multipart/form-data; boundary=" & strBoundary
        .setRequestHeader "Content-Length", LenB(sPayLoad)
        .setRequestHeader "Host", "electool.com"
        .setRequestHeader "Cookie", myCookie
        .setRequestHeader "Referer", ie.url
        .send (sPayLoad)
        Debug.Print .responseText
    End With
End Sub

Function GetFile(ByVal FileName As String) As String
    Dim FileContents() As Byte, FileNumber As Integer
    ReDim FileContents(FileLen(FileName) - 1)
    FileNumber = FreeFile()
    Open FileName For Binary As FileNumber
    Get FileNumber, , FileContents
    Close (FileNumber)
    GetFile = StrConv(FileContents, vbUnicode)
End Function

The response I get is this: ng failed; nested exception is com.electool.sourcing.framework.util.request.exception.RequestParameterNotPresentException: Not found parameter: [qId] in request! ng failed; nested exception is com.electool.sourcing.framework.util.request.exception.RequestParameterNotPresentException: Not found parameter: [qId] in request!

I also tried what I have found on this link, but still not working (or I am not implementing it well in VBA) https://wqweto.wordpress.com/2011/07/12/vb6-using-wininet-to-post-binary-file/

I managed to make this work, useig the concept from the link below (there were also issues with the boundaries). File updload in post form in VBS

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM