>source

웹 브라우저를 통해 문서를 업로드할 때 전송된 양식-데이터 멀티파트 구조에 따라 VBA를 사용하여 웹 서비스에 파일을 업로드하려고 하는데 "400: Invalid multipart payload format" 응답을 수신하고 있습니다. (내가 말할 수있는 것에서) 요청의 동일한 페이로드.

내 테스트 사례를 위해 "TestContents"가 포함된 test.txt라는 txt 문서를 만들었습니다. 웹 브라우저를 사용하여 이 파일을 업로드했으며 VBA로도 이 작업을 시도했습니다(아래 참조). Chrome의 페이로드를 내 자신의 VBA 생성 페이로드와 비교하는 데 시간을 할애하여 차이점을 볼 수 없습니다.

[ https://stackoverflow.com/questions/50110601/upload-a-picture-to-file-io-http-post-in-vba]

(내 혼란에 대한 사과 -꽤 오랫동안 이것을 변경하고 다시 작성하여 약간의 어수선한 부분이 있을 수 있음)

Private Function toArray(inData As String)
    Dim objADODB As Object: Set objADODB= CreateObject("ADODB.Stream")
     objADODB.Type= 2
     objADODB.Charset= "_autodetect"
     objADODB.Open
     objADODB.WriteText (inData)
     objADODB.Position= 0
     objADODB.Type= 1
     toArray= objADODB.Read()
     Set objADODB= Nothing
End Function
Private Function readBinary(filePath As String)
    Dim objADODB As Object: Set objADODB= CreateObject("ADODB.Stream")
    objADODB.Type= 1
    objADODB.Open
    objADODB.LoadFromFile filePath
    readBinary= objADODB.Read
    objADODB.Close
    Set objADODB= Nothing
End Function
Public Sub sendDocument(ByVal inID As String, ByVal tags As String, ByVal docContentType As String, ByVal docFilePath As String)
     Dim objADODB As Object
     Dim objHTTP As Object
     Dim boundary As String: boundary= "----WebKitFormBoundaryeeYChAY7UlBEI63d" 'Set like this so i can debug like-for-like with browser payload
     Dim docFileName As String: docFileName= Mid(docFilePath, InStrRev(docFilePath, "\") + 1)
     '(structure is file, material, tags if there are any)
     Set objADODB= CreateObject("ADODB.Stream")
     With objADODB
         .Type= 1
         .Open
         .Write toArray("--" &
 boundary &
 Chr(10))
         .Write toArray("Content-Disposition: form-data; name=""file""; filename=""" &
 docFileName &
 """" &
 Chr(10) &
 _
                 "Content-Type: " &
 docContentType &
 Chr(10) &
 Chr(10))
         .Write readBinary(docFilePath)
         .Write toArray(Chr(10) &
 "--" &
 boundary &
 Chr(10))
         .Write toArray("Content-Disposition: form-data; name=""material""" &
 Chr(10) &
 Chr(10) &
 inID &
 Chr(10))
         If tags <> "" Then .Write toArray("Content-Disposition: form-data; name=""tags""" &amp;
 Chr(10) &amp;
 Chr(10) &amp;
 tags &amp;
 Chr(10))
         .Write toArray("--" &amp;
 boundary &amp;
 "--")
         .Position= 0
     End With
     If Not validateID(inID) Then
         MsgBox ("ID must be 4-5 digits long")
         Exit Sub
     End If
     If auth= "" Then
         MsgBox "Login is required. Click OK to log in"
         Call getAuth
     End If
     Set objHTTP= CreateObject("MSXML2.ServerXMLHTTP")
     With objHTTP
         .Open "POST", "https://xxx.xxx/hapi/document", False
         .setRequestHeader "Authorization", auth
         .setRequestHeader "Content-Type", "multipart/form-data; boundary=" &amp;
 boundary
         .send (objADODB.Read())
         MsgBox .responseText
     End With
     bStatusOK= objHTTP.status= 200
     If objHTTP.status= 401 Then
         MsgBox ("Login is invalid/expired. Please reauthenticate")
         Call getAuth
     End If
End Sub

위는 요청에 대한 양식 데이터를 볼 때 Chrome의 검사기 창에 표시되는 것과 동일한 페이로드를 생성합니다.

------WebKitFormBoundaryeeYChAY7UlBEI63d
Content-Disposition: form-data; name="file"; filename="Test.txt"
Content-Type: text/plain
TestContents
------WebKitFormBoundaryeeYChAY7UlBEI63d
Content-Disposition: form-data; name="material"
16145
------WebKitFormBoundaryeeYChAY7UlBEI63d--

제대로 인코딩되지 않은 것 같습니다. 브라우저 호출이 헤더를 사용한다는 점에 유의하십시오.

Accept-Encoding: gzip, deflate, br

..이 유형 또는 단일 유형(br 제외)을 복제하려고 할 때 여전히 동일한 메시지가 표시되지만 VBA 지역 창에서 이해할 수 없는 형식으로 응답합니다. 나는 Accept-Encoding을 지정할 필요 없이 JSON 또는 텍스트 페이로드를 보내는 다른 POST 및 PUT 요청으로 성공했기 때문에 이것이 계속하기에 올바른 경로인지 확신할 수 없습니다.

누군가 이 문제에 대해 도움을 줄 수 있다면 정말 감사할 것입니다.

감사합니다!

Chr(10) 대신 vbCrLF를 사용해 보십시오.

CDP18022021-12-21 01:54:14

Aargh 그것은 나를 얻은 가장 간단한 것이었습니다. 이것은 매력을 발휘했습니다. 대단히 감사합니다!!

notlegit2021-12-21 01:54:14
  • 이전 mysql : 아니오를 계산하는 더 간결한 방법. 날짜당 여러 개 있는 경우 개최되는 수업/행사 수
  • 다음 레일 서버를 실행할 수 없습니다