2013-08-12 2 views
1

나는 하루 종일 노력했지만 아무런 운이 없으면 나는 만들었지 만 내가 할려고 할 때 winhttpsendrequest가 183 오류를 던지면 PHP는 이미지 파일을 업로드 할 수 없다.msdn 이미지 업로드 winhttp C++

int _tmain(int argc, _TCHAR* argv[]) { 

HINTERNET hSession = NULL, 
    hConnect = NULL, 
    hRequest = NULL; 
BOOL bResults = FALSE; 

FILE *pFile; 
long lSize; 
char *buffer; 
size_t result; 

pFile = fopen("blog.jpg", "rb"); 

fseek(pFile, 0, SEEK_END); 
lSize = ftell(pFile); 
rewind(pFile); 

buffer = (char *) malloc(sizeof(char) * lSize); 

result = fread(buffer, 1, lSize, pFile); 

fclose(pFile); 

hSession = WinHttpOpen(L"WinHTTP Example/1.0", 
    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, 
    WINHTTP_NO_PROXY_NAME, 
    WINHTTP_NO_PROXY_BYPASS, 0); 

if (hSession) 
    hConnect = WinHttpConnect(hSession, L"localhost", 
    INTERNET_DEFAULT_HTTP_PORT, 0); 

if (hConnect) 
    hRequest = WinHttpOpenRequest(hConnect, L"POST", L"locker/upload.php", 
    NULL, WINHTTP_NO_REFERER, 
    WINHTTP_DEFAULT_ACCEPT_TYPES, 
    WINHTTP_FLAG_REFRESH); 

static WCHAR frmdata[2048] = L"Connection: keep-alive\r\nContent-Type: multipart/form-data; -----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"file\"; filename=\"blog.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"; 

bResults = WinHttpSendRequest(hRequest, 
    frmdata, wcslen(frmdata), buffer, 
    lSize, wcslen(frmdata)+lSize, 0); 

if (bResults) { 
    /* 
    DWORD dwBytesWritten = 0; 
    bResults = WinHttpWriteData(hRequest, buffer, 
     lSize, 
     &dwBytesWritten); 
    if (bResults) { 
     printf_s("Data: %d", dwBytesWritten); 
    } 
    */ 

} else { 
    printf_s("SendReq: %d", GetLastError()); 
} 


free(buffer); 

if (hRequest) { WinHttpCloseHandle(hRequest); } 
if (hConnect) { WinHttpCloseHandle(hConnect); } 
if (hSession) { WinHttpCloseHandle(hSession); } 

getchar(); 

return 0; 
    } 

PHP 코드 :

if (isset($_FILES["file"])) { 
$target_path = "uploads/"; 

$target_path = $target_path . basename($_FILES['file']['name']); 

if(move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) { 
echo "The file ". basename($_FILES['file']['name']). " has been uploaded"; 
} else{ 
echo "There was an error uploading the file, please try again!"; 
} 
} 
+0

비슷한 문제가 발생했습니다. 간헐적으로 오류 183으로 전송이 실패하고 간헐적으로 다시 실패 할 때까지 연결을 다시 작성하면 도움이됩니다. – ActiveTrayPrntrTagDataStrDrvr

+0

winsock을 사용하고 헤더와 사용자를 올바르게 확인하십시오 \ r \ n 그리고 테두리를 설정할 때 여분의 간격을 두어야합니다. –

+0

모두 검사했습니다. 동일한 호스트에 둘 이상의 연결이있을 때 발생하는 산발적 인 버그가있는 것 같습니다. HTTP 추적은 WinHttpSendRequest 비동기 완료시 ERROR_ALREADY_EXISTS를보고합니다. 다른 호스트와의 연결에서 발생하지 않는 것 같습니다. – ActiveTrayPrntrTagDataStrDrvr

답변

2

Keshav 나이 르 이미 누군가가 내가 잘못

C++ 코드를 나는 곳을 가리킬 수 있습니다하십시오 전송되는 파일을 보낼 수 있습니다. 이 코드에

시도 :

CHAR postData[1024]; 
CHAR postData2[1024]; 
ZeroMemory(&postData,1024); 
ZeroMemory(&postData2,1024); 
WinHttpAddRequestHeaders(hRequest,L"Content-Type: multipart/form-data; boundary=----OiRBxC0fjdSEpqhd",-1L,WINHTTP_ADDREQ_FLAG_ADD); 
wsprintfA(postData,"%s","----OiRBxC0fjdSEpqhd\r\nContent-Disposition: form-data; name=\"file\"; filename=\"blog.jpg\"\r\nContent-Type: image/jpeg\r\n\r\n"); 
wsprintfA(postData2,"%s","\r\n----OiRBxC0fjdSEpqhd\r\nContent-Disposition: form-data; name=\"submit\"\r\n\r\nSubmit\r\n----OiRBxC0fjdSEpqhd--\r\n"); 
bResults = WinHttpSendRequest(hRequest, 
            WINHTTP_NO_ADDITIONAL_HEADERS, 
            0, WINHTTP_NO_REQUEST_DATA, 0, 
            lstrlenA(postData)+lstrlenA(postData2)+lSize, NULL); 
if (bResults) 
{ 
    bResults=WinHttpWriteData(hRequest,LPCVOID)postData,lstrlenA(postData),NULL); 
    bResults = WinHttpWriteData(hRequest, buffer, lSize, &dwBytesWritten); 
    bResults=WinHttpWriteData(hRequest,(LPCVOID)postData2,lstrlenA(postData2),NULL); 
} 

WinHttpWriteData : POST 데이터 - postData를가 postData2 8 비트 인코딩해야합니다.

+0

예, 나중에 경계 및 보낼 파일 데이터를 추가 공간이 있어야하지만이 ActiveTrayPrntrTagDataStrDrvr 도움이 될 수 및 올바른 (나는 그것을 테스트하지 않은 있지만 읽을 수 있습니다 : p) –