Я хочу загрузить «D: \ er.txt» на веб-сервер, используя HTTP, когда я запускаю программу, я получил HttpSendRequest 12005 как ошибку. Я использовал PHP-скрипт на своем веб-сервере, который примет файл и сохранит его в предварительно созданном каталоге с именем «upload» .. вот моя крошечная программа
int main() { static TCHAR frmdata[] = "-----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"uploadedfile\"; filename=\"D:\\er.txt\"\r\nContent-Type: text/plain\r\n\r\nfile contents here\r\n-----------------------------7d82751e2bc0858--\r\n"; static TCHAR hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858"; HINTERNET hSession = InternetOpen("MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(!hSession) { cout<<"Error: InternetOpen"; } HINTERNET hConnect = InternetConnect(hSession, _T("http://jobnews.netii.net/upload.php"),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1); if(!hConnect) { cout<<"Error: InternetConnect"; } HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST",_T("upload.php"), NULL, NULL, (const char**)"*/*\0", 0, 1); if(hRequest==NULL) { cout<<"Error: HttpOpenRequest"; } BOOL sent= HttpSendRequest(hRequest, hdrs, strlen(hdrs), frmdata, strlen(frmdata)); if(!sent) { cout<<"Error: HttpSendRequest "<<GetLastError(); } //close any valid internet-handles InternetCloseHandle(hSession); InternetCloseHandle(hConnect); InternetCloseHandle(hRequest); getchar(); return 0; }
и мой PHP-скрипт
<?php $uploaddir = 'upload/'; // Relative Upload Location of data file if (is_uploaded_file($_FILES['uploadedfile']['tmp_name'])) { $uploadfile = $uploaddir . basename($_FILES['uploadedfile']['name']); echo "File ". $_FILES['uploadedfile']['name'] ." uploaded successfully. "; if (move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $uploadfile)) { echo "File is valid, and was successfully moved. "; } else print_r($_FILES); } else { echo "Upload Failed!!!"; print_r($_FILES); } ?>
Согласно документам для HttpOpenRequest , аргумент lplpszAcceptTypes
должен измениться с
(const char**)"*/*\0"
в
{_T("*/*"), NULL}
Вы также можете удалить \0
из конца строки. Вам не нужно вручную вставлять nul-терминатор в строковый литерал.
Другими словами, вам нужно изменить
HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST", _T("upload.php"), NULL, NULL, (const char**)"*/*\0", 0, 1);
в
LPCTSTR rgpszAcceptTypes[] = {_T("*/*"), NULL}; HINTERNET hRequest = HttpOpenRequest(hConnect, (const char*)"POST", _T("upload.php"), NULL, NULL, rgpszAcceptTypes, 0, 1);