gpt4 book ai didi

c++ - 使用 C++ Winsock API 上传 PNG 文件(HTTP POST)

转载 作者:行者123 更新时间:2023-11-28 08:24:23 25 4
gpt4 key购买 nike

我正在尝试通过 Winsock2 HTTP Post 上传 PNG 文件。这是我的请求字符串:

boundary = "-----rueldotme";                                                                
request += "POST " + uri + " HTTP/1.1\r\n";
request += "Host: " + hostname + "\r\n";
request += "User-Agent: " + UserAgent + "\r\n";
request += "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n";
request += "Accept-Language: en-us,en;q=0.5\r\n";
request += "Accept-Encoding: gzip,deflate\r\n";
request += "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
request += "Keep-Alive: 115\r\n";
request += "Connection: keep-alive\r\n";
request += "Content-Length: " + fileSize + "\r\n";
request += "Content-Type: multipart/form-data, boundary=" + boundary + "\r\n";
request += "\r\n";
request += "--" + boundary + "\r\n";
request += "Content-Disposition: form-data; name=\"filename\"; filename=\"" + fileName + "\"\r\n";
request += "Content-Type: image/png; charset=binary\r\n";
request += "Content-Transfer-Encoding: binary\r\n";
request += "\r\n";
request += "%s\r\n";
request += "\r\n";

连接正常,没有错误等等,顺便说一句,fileCon 来自 ReadFile()。而且没有错误代码。读取的字节数与 GetFileSize() 的输出相同。我尝试显示 fileCon 的内容,但只给了我这个:

alt text

不要介意标题“错误”(我设置的)。

此外,该请求需要很长时间才能完成,并给我一个空白的答复。是的,没有 HTTP header 的空白。我做的请求对吗?我真的必须在 POST 数据中包含文件内容吗?

提前致谢。

编辑:PNG 大小约为 256KB。我的连接速度为 1mbps。

编辑:如果信息不足,我们深表歉意。不管怎样,这是我最近所做的:

int flz;
char bdata[BSIZE];
DWORD dwe, bytesRead = 0;
HANDLE fh = CreateFile(fileName.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
LPVOID fbuff = NULL;
flz = GetFileSize(fh, NULL);
fbuff = malloc(flz);
ReadFile(fh, fbuff, flz, &bytesRead, NULL));

...

sprintf_s(bdata, BSIZE, request.c_str(), reinterpret_cast<char *>(fbuff)); //BSIZE = 1024

...

send(sock, bdata, std::strlen(bdata), 0);

最佳答案

没有足够的信息来解决这个问题,所以我会给出一个元答案:使用数据包嗅探器(例如 wireshark )来准确检查实际发送和接收的数据。这将让您验证请求是否符合要求,以及您得到的“空白响应”是否真的是空白。

黑暗中的野蛮刺杀:您没有在代码片段中包含任何变量声明,所以我不知道“fileCon”是什么类型,但不要忘记 PNG 数据可能包含空字节,这会搞乱从一个 char* 到一个 std::string

编辑:您的修改包含与基于 std::string 的版本相同的错误,即 PNG 数据可能包含空字节。也许这段代码会解释得更清楚:

const char* data = "Hello\0world."; // some data that contains a null byte
std::string dataStr(data);
std::cout << dataStr << "\n"; // will print "Hello".
std::cout << dataStr.size() << "\n"; // will print "5"
char buf[512];
sprintf_s(buf, sizeof(buf), "Data: %s\n", data);
std::cout << buf; // will print "Data: Hello"

转换为 std::string 和使用 sprintf 格式化都会将空字节解释为数据的结尾,因此原始数据的其余部分也是如此("world.") 永远不会被使用。

关于c++ - 使用 C++ Winsock API 上传 PNG 文件(HTTP POST),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4553916/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com