2015-08-20 49 views
0

我在MFC中使用WinINet類將文件上傳到網絡服務器。 當我運行這個程序時,httpSendRequestEx返回12005錯誤,這是無效的url。 如果我在http前面加上http://,httpSendRequestEx返回12007錯誤,即「服務器名稱無法解析」。 我花了整整一天的時間來解決這個問題,但我不知道如何解決這個問題。 請幫我在MFC中使用WinINet的問題

這是我的代碼。

CString m_strBoundary = ("abcdefg"); 
LPCTSTR lpszFilePath = "C:\\MFCprj\\WinINet_Example2\\WinINet_Example2\\Full.jpg"; 
LPCTSTR lpszFileName = "Full.jpg";; 
HANDLE hFile = CreateFile("C:\\MFCprj\\WinINet_Example2\\WinINet_Example2\\Full.jpg", GENERIC_READ, 0, 0, 0, 0, 0); 

HINTERNET hInternet = ::InternetOpen("WININETEXAMPLE", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 
if(!hInternet) 
{ 
    AfxMessageBox("InternetOpen has an error"); 
} 

HINTERNET hConnection = ::InternetConnect(hInternet, "192.168.88.4:8090/mrbs/controller?do=XML_MULTIPART_TEST_ACTION", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); 
if(!hConnection)          
{ 
    AfxMessageBox("InternetConnect has an error"); 
} 

HINTERNET hRequest = ::HttpOpenRequest(hConnection, "POST", "/jsp/inc/head.jsp", NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0); 
if(!hRequest) 
{ 
    AfxMessageBox("HttpOpenRequest has an error"); 
} 

//HTTP header 
_bstr_t strHeader; 
strHeader = "Content-Type: multipart/form-data; boundary="; 
strHeader = strHeader + m_strBoundary; 
::HttpAddRequestHeaders(hRequest, (LPCTSTR)strHeader, -1, 0); 

//Body header 
_bstr_t strFilePartHead("--"); 
strFilePartHead = strFilePartHead + m_strBoundary; 
strFilePartHead = strFilePartHead + "\r\nContent-Disposition: form-data; name=\"file\"; filename=\"Full.jpg\""; 
strFilePartHead = strFilePartHead + "\"\r\nContent-Type: application/vnd.ms-excel\r\n\r\n"; 

_bstr_t strFilePartTail("\r\n"); 
strFilePartTail = strFilePartTail + "--"; 
strFilePartTail = strFilePartTail + m_strBoundary; 
strFilePartTail = strFilePartTail + "--\r\n"; 

INTERNET_BUFFERS BufferIn; 
BufferIn.dwStructSize = sizeof(INTERNET_BUFFERS); 
BufferIn.Next = NULL; 
BufferIn.lpcszHeader = (LPCTSTR)strHeader; 
BufferIn.dwBufferLength = 0; 
BufferIn.dwBufferTotal = GetFileSize(lpszFilePath) + strlen((LPCSTR)strFilePartHead) + strlen((LPCSTR)strFilePartTail); 
BufferIn.dwHeadersLength = lstrlen((LPCTSTR)strHeader); 
BufferIn.dwHeadersTotal = lstrlen((LPCTSTR)strHeader); 
BufferIn.lpvBuffer = NULL; 
BufferIn.dwOffsetHigh = 0; 
BufferIn.dwOffsetLow = 0; 

if(!::HttpSendRequestEx(hRequest, &BufferIn, NULL, 0, NULL)) 
{ 
    DWORD dwError = GetLastError(); 
    ::InternetCloseHandle(hRequest); 
    ::InternetCloseHandle(hConnection); 
    ::InternetCloseHandle(hInternet); 
} 
+0

這不是MFC,你可以使用'WinAPI'而不是'MFC'標記 –

回答

1

InternetConnect只接受服務器名稱/地址和端口。

hConnection = ::InternetConnect(hInternet, "192.168.88.4", 8090, ...); 

這是因爲InternetConnect僅向服務器的連接(一臺機器上的某個端口的地方)。該URL構成對服務器的請求的一部分,因此實際上需要將您傳遞給InternetConnect的附加字符串(「/ mrbs/controller?do = XML_MULTIPART_TEST_ACTION」)發送給HttpOpenRequest

hRequest = ::HttpOpenRequest(hConnection, "POST", "/mrbs/controller?do=XML_MULTIPART_TEST_ACTION", ...); 

我不知道其中「/jsp/inc/head.jsp」你最初傳遞給HttpOpenRequest適合的,但如果真的是URL的一部分太,那麼你會怎麼做這個:

hRequest = ::HttpOpenRequest(hConnection, "POST", "/mrbs/controller?do=XML_MULTIPART_TEST_ACTION/jsp/inc/head.jsp", ...); 
+0

非常感謝。 hRequest = :: HttpOpenRequest(hConnection,「POST」,「/ mrbs/controller?do = XML_MULTIPART_TEST_ACTION」,...);現在它適用於我。 –

+0

我可以再問一個問題嗎?我嘗試將圖像文件上傳到服務器,但只上傳4kb。我應該修改什麼來獲得足夠的緩衝區? –

+1

@JunHyunPark我不知道對不起,你可能會更好地發佈這個新問題。 –