메뉴
미해결 엑셀2016윈도우10

VBA 이미지파일 업로드 문제

f
2월 24일 조회 2,947
VBA winhttp로  multipart/form-data로 특정 웹서버에 jpg이미지 파일을 업로드 하려고 합니다.

코드와 responseText는 아래와같습니다.

아무리 구글링을 해서 예제코드를사용해서 이미지 파일을 binary로 만들어 업로드해도 에러가 나네요. 문제 에러메제지도 특정되지 않아 뭐가 잘못된건지 모르겠네요.. 고수분들 도와주세요 ㅜㅜ

감사합니다.

 

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''코드'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Sub UploadImage()
Dim WinHttp As New WinHttp.WinHttpRequest

Dim Header1 As String, Header2 As String
Dim Binary() As Byte, Buffer() As Byte
Dim BHeader1() As Byte, BHeader2() As Byte
Dim Size1 As Long, Size2 As Long, Size3 As Long

Boundary_str = "----WebKitFormBoundarylyGtAJWECF0qDL4d"
fpath = "C:\CNW_1000025913.jpg"
fname = "CNW_1000025913.jpg"

img_upload_url = "https://xxx.com/common/uploadImage.json"

Header1 = ""
Header1 = Header1 + "--" & Boundary_str & vbCrLf
Header1 = Header1 + "Content-Disposition: form-data; name=""fileArr""; filename=""" & fname & """" & vbCrLf
Header1 = Header1 + "Content-Type: image/jpeg" & vbCrLf & vbCrLf
Header2 = vbCrLf
Header2 = Header2 + "--" & Boundary_str & vbCrLf
Header2 = Header2 + "Content-Disposition: form-data; name=""imgKey""" & vbCrLf & vbCrLf
Header2 = Header2 + "ProductMainImageResizing" & vbCrLf
Header2 = Header2 + "--" & Boundary_str & vbCrLf
Header2 = Header2 + "Content-Disposition: form-data; name=""mode""" & vbCrLf & vbCrLf
Header2 = Header2 + "temp" & vbCrLf
Header2 = Header2 + "--" & Boundary_str & vbCrLf
Header2 = Header2 + "Content-Disposition: form-data; name=""baseKeyCd""" & vbCrLf & vbCrLf
Header2 = Header2 + "" & vbCrLf
Header2 = Header2 + "--" & Boundary_str & vbCrLf
Header2 = Header2 + "Content-Disposition: form-data; name=""filename""" & vbCrLf & vbCrLf
Header2 = Header2 + "fileArr" & vbCrLf
Header2 = Header2 + "--" & Boundary_str & "--"

FN = FreeFile
Open fpath For Binary Access Read As #FN
ReDim Binary(LOF(1))
Get #FN, , Binary
Close #FN
BHeader1 = StrConv(Header1, vbFromUnicode)
BHeader2 = StrConv(Header2, vbFromUnicode)
'
Size1 = UBound(BHeader1)
Size2 = UBound(Binary)
Size3 = UBound(BHeader2)

ReDim Buffer(Size1 + Size2 + Size3 + 2)
CopyMemory Buffer(0), BHeader1(0), Size1 + 1
CopyMemory Buffer(Size1 + 1), Binary(0), Size2 + 1
CopyMemory Buffer(Size1 + Size2 + 2), BHeader2(0), Size3 + 1

With WinHttp
.Open "POST", img_upload_url
.SetRequestHeader "accept", "application/json, text/javascript, */*; q=0.01"
.SetRequestHeader "accept-encoding", "deflate, br"
.SetRequestHeader "accept-language", "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7"

.SetRequestHeader "connection", "keep-alive"
.SetRequestHeader "content-length", UBound(Buffer)
.SetRequestHeader "content-type", "multipart/form-data; boundary=" & Boundary_str

.SetRequestHeader "sec-ch-ua", """Whale"";v=""3"", "" Not;A Brand"";v=""99"", ""Chromium"";v=""96"""
.SetRequestHeader "sec-ch-ua-mobile", "?0"
.SetRequestHeader "sec-ch-ua-platform", """Windows"""

.SetRequestHeader "sec-fetch-site", "same-origin"
.SetRequestHeader "sec-fetch-mode", "cors"
.SetRequestHeader "sec-fetch-dest", "empty"
.SetRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Whale/3.12.129.46 Safari/537.36"
.SetRequestHeader "X-Requested-With", "XMLHttpRequest"
.Send Buffer

.WaitForResponse
outStr = .ResponseText
End With

Erase Binary
Erase Buffer
Erase BHeader1
Erase BHeader2

Debug.Print outStr

End Sub

 

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''Error 메세지'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

?outStr
{"errors":[{"status":"500","title":"2bf8c91c66f6cc00","source":{"pointer":"/common/uploadImage.json"},"meta":"yyyy.com"}]}

댓글 3

더
더블유에이 2월 25일
보통 upload는 base64로 인코딩해서 보내지 않나요?

사용하시는 api 레퍼런스를 한번 살펴보세요. 아마 base64 형태가 아니여서 오류가 나는게 아닐까 생각됩니다
f
fika**** 작성자 2월 25일
@더블유에이 님 Base64로 string  과 파일 바이너리 모두 인코딩하라는 말씀인가요? 해봤는데도 안되니요 ㅠㅠ
더
더블유에이 2월 26일
@fika**** 님 아뇨 base64로만 인코딩하면 될겁니다. 사용하는 api를 직접 확인해보시면 좋을 것 같아요.

api에서 받아들이는 형식에 따라 다릅니다

질문답변 게시판의 최근 글

스크랩 완료