【发布时间】:2018-12-23 03:57:23
【问题描述】:
我想使用 POST 方法将文件传输到站点 在 php 站点上,脚本接受“userfile”并将其保存在服务器上
void SendFile()
{
const char hdrs[] = "Content-Type: multipart/form-data; boundary=--------071418204214402\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
char* data1 = "----------071418204214402\n"
"Content-Disposition: form-data; name=\"userfile\"; filename=\"file.zip\"\n"
"Content-Type: text/plain\n"
"Content-Transfer-Encoding: binary\n\n";
char* filecontent = "Hello World!"; // Simulated the contents of the file with a string.
char* data2 = "\n----------071418204214402--\n";
char* allstr = calloc(strlen(data1) + strlen(filecontent) + strlen(data2) + 1, 1);
strcat(allstr, data1);
strcat(allstr, filecontent);
strcat(allstr, data2);
HINTERNET hSession = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, "crazra94.beget.tech", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "/send.php", NULL, NULL, NULL, 0, 1);
HttpAddRequestHeaders(hRequest, hdrs, -1, HTTP_ADDREQ_FLAG_REPLACE | HTTP_ADDREQ_FLAG_ADD);
INTERNET_BUFFERS bufferIn;
LPDWORD bytesWritten;
memset(&bufferIn, 0, sizeof(INTERNET_BUFFERS));
bufferIn.dwStructSize = sizeof(INTERNET_BUFFERS);
bufferIn.dwBufferTotal = strlen(data1) + strlen(filecontent) + strlen(data2)+1;
HttpSendRequestEx(hRequest, &bufferIn, NULL, HSR_INITIATE, 0);
InternetWriteFile(hRequest, (const void*)data1, strlen(data1)+1, bytesWritten);
InternetWriteFile(hRequest, (const void*)filecontent, strlen(filecontent)+1, bytesWritten); // File
InternetWriteFile(hRequest, (const void*)data2, strlen(data2)+1, bytesWritten);
HttpEndRequest(hRequest, NULL, HSR_INITIATE, 0);
}
文件未发送(请求不正确) 可以修吗?
更新: 此代码工作正确。 但我不知道如何将二进制文件放入字符数组中。 这是用于发送文本文件:
void SendFile()
{
const unsigned char hdrs[] = "Content-Type: multipart/form-data; boundary=--------071418204214402\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
unsigned char* data1 = "----------071418204214402\r\n"
"Content-Disposition: form-data; name=\"userfile\"; filename=\"test2.txt\"\r\n"
"Content-Type: text/plain\r\n"
"Content-Transfer-Encoding: binary\r\n\r\n";
unsigned char* filecontent = "Hello World!";
unsigned char* data2 = "\r\n----------071418204214402--\r\n";
unsigned char* allstr = calloc(strlen(data1) + strlen(filecontent) + strlen(data2) + 1, sizeof(unsigned char));
strcat(allstr, data1);
strcat(allstr, filecontent);
strcat(allstr, data2);
HINTERNET hSession = InternetOpen("MyAgent", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
HINTERNET hConnect = InternetConnect(hSession, "crazra94.beget.tech", INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", "/send.php", NULL, NULL, NULL, 0, 1);
HttpSendRequest(hRequest, hdrs, strlen(hdrs), allstr, strlen(allstr));
}
【问题讨论】:
-
真实代码是否也完全错过了所有错误检查?如果是,请将其与任何合理的错误记录一起添加并重新测试。
-
代码编译执行没有错误。但是文件没有到达服务器。如何获取最新的错误信息? (我用的是 GCC 编译器)
-
另外,如果您使用了 C 编译器,这些转换
(const void*)就没有必要了。你使用哪个编译器? -
适用于 Windows 的 GCC。 C 编译器。
-
没有测试,所以不知道有没有错误
标签: c file winapi send wininet