【问题标题】:msdn upload image with winhttp c++msdn用winhttp c++​​上传图片
【发布时间】:2013-08-12 17:47:01
【问题描述】:

我一整天都在尝试这个但是没有运气我想将图像文件上传到我创建的 php 文件但是当我尝试这样做时 winhttpsendrequest 会抛出 183 错误,这意味着无法发送已经发送的文件请有人指出我哪里错了

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!";
}
}

【问题讨论】:

  • 我遇到了类似的问题...发送偶尔会失败并出现错误 183,只有重新创建连接会有所帮助,直到它偶尔再次失败。
  • 使用winsock并记得正确检查标题和用户\r\n,设置边框时必须留出额外的间隙
  • 都检查过了。当与同一主机有多个连接时,似乎会发生零星的错误。 HTTP 跟踪在 WinHttpSendRequest 异步完成时报告 ERROR_ALREADY_EXISTS。与不同主机的连接似乎不会发生。
  • @ActiveTrayPrntrTagDataStrDrvr 请查看我标记为正确的代码,请仔细查看发送的标头并重命名发送的文件,因为正在上传的文件名可能存在

标签: c++ c msdn winhttp


【解决方案1】:

凯沙夫奈尔。

试试这个代码:

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 位编码。

【讨论】:

  • 是的,我后来确实意识到,在边界之后,要发送的文件数据应该有额外的空格,但这可以帮助 ActiveTrayPrntrTagDataStrDrvr 并且它是正确的(我没有测试它,但我可以阅读:p)
猜你喜欢
  • 2011-10-25
  • 2021-03-19
  • 1970-01-01
  • 2017-04-28
  • 2011-05-21
  • 2014-01-03
  • 1970-01-01
  • 1970-01-01
  • 2013-12-25
相关资源
最近更新 更多