我想将“C:\ test.txt”上传到网络服务器,当我运行程序时,文件没有上传并且没有任何错误。
the complete C++ code can be find here
和Web服务器上的php代码可以在这里找到:“http://student114.110mb.com/upload.txt”
要么
“http://student114.110mb.com/upload.php”
请帮助我哪里做错了
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>
#pragma comment(lib,"wininet.lib")
using namespace std;
int main()
{
static TCHAR frmdata[] = "-----------------------------7d82751e2bc0858\nContent-Disposition: form-data; name=\"uploadedfile\"; filename=\"C:\test.txt\"\nContent-Type: text/plain\n\nfile contents here\n-----------------------------7d82751e2bc0858--";
static TCHAR hdrs[] = "Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858";
HINTERNET hSession = InternetOpen("MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hSession==NULL)
{
cout<<"Error: InternetOpen";
}
HINTERNET hConnect = InternetConnect(hSession, _T("localhost"),INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
if(hConnect==NULL)
{
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";
}
//close any valid internet-handles
InternetCloseHandle(hSession);
InternetCloseHandle(hConnect);
InternetCloseHandle(hRequest);
return 0;
}
最佳答案
我能够使您的代码正常工作。
首先,您提供的链接上的代码与您发布的代码不同:
InternetConnect(hSession, _T("localhost"), ...
InternetConnect(hSession, _T("http://student114.110mb.com"), ...
您必须在此处传递主机名或IP地址,以便“localhost”是好的,但“http://student114.110mb.com”不是。
如果传递URL,您将获得12005错误代码[see WinINet error codes on msdn]。
另一个问题是frmdata字符串。您应该在C:\ test.txt中将反斜杠加倍,否则您的字符串中将得到制表符\ t。分隔符之前和之后的\ n也应替换为\ r \ n,因为RFC 1521和大多数其他Internet协议(protocol)使用CRLF作为行分隔符。
这是我使用过的字符串。
static TCHAR frmdata[] = "-----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"uploadedfile\"; filename=\"C:\\test.txt\"\r\nContent-Type: text/plain\r\n\r\nfile contents here\r\n-----------------------------7d82751e2bc0858--\r\n";
最后,PHP代码不起作用,因为您使用了$ _FILES [“file”],而您应该使用$ _FILES [“uploadedfile”]。 “uploadedfile”通常对应于HTML中标记的名称,但是在您的情况下,它是在frmdata []字符串的name =参数中指定的。
这是我用来测试的PHP代码
move_uploaded_file($_FILES["uploadedfile"]["tmp_name"], "/files/my_file");
当您像这样进行复杂的客户端/服务器交互时,有助于分别测试每个部分。例如,您可以。
测试您的PHP脚本
netcat并检查输出
关于c++ - Dev C++ Wininet使用HTTP上传文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1985345/