C++POST方式传图片,服务器收到的内容不对

herost 2011-05-17 01:51:13
用C++ winsock方式传图片,结果服务器只收到4字节..代码如下 :
void file_con(char **buffer,LPCSTR file)
{
FILE *fp = fopen(file, "rb+");
fseek(fp, 0, SEEK_END);
long l_file_len = ftell(fp);
rewind(fp);

*buffer = new char[l_file_len + 1];
memset(*buffer, 0, l_file_len + 1);
fread(*buffer, l_file_len, 1, fp);
fclose(fp);
}
std::string upload(LPCSTR lpszServer,LPCSTR lpszAddr,LPCSTR file)
{
char *f = NULL;
file_con(&f,file);
SOCKET sock = ::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
return "0";
SOCKADDR_IN server;
server.sin_family = AF_INET;
server.sin_port = htons(80);
struct hostent *host_addr = gethostbyname(lpszServer);
if (host_addr == NULL)
return "host_addr == NULL";
server.sin_addr.s_addr = *((int *) *host_addr->h_addr_list);
if (::connect(sock, (SOCKADDR *) &server, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
::closesocket(sock);
return "0";
}
printf("ip address = %s, port = %d\n",inet_ntoa(server.sin_addr), ntohs(server.sin_port));

std::string header("");

header += "POST ";
header += lpszAddr;
header += " HTTP/1.1\r\n";
header += "User-Agent: Mozilla/4.0\r\n";
header += "Host: ";
header += lpszServer;
header += "\r\n";
header += "Pragma: no-cache\r\n";
header += "Accept: */*\r\n";
header += "Content-Type: multipart/form-data; boundary=----------------------------64b23e4066ed\r\n";
std::string content("");
content += "------------------------------64b23e4066ed\r\n";
content += "Content-Disposition: form-data; name='id'\r\n\r\n";
content += "3365863\r\n";
content += "------------------------------64b23e4066ed\r\n";
content += "Content-Disposition: form-data; name='myfiles'; filename='img.jpg'\r\n";
content += "Content-Type: custom\r\n\r\n";
content += f;
content += "\r\n------------------------------64b23e4066ed--\r\n";

char temp[64] = {0};
sprintf(temp, "Content-Length: %d\r\n\r\n", content.length());
header += temp;
std::string str_http_request = header + content;
send(sock, str_http_request.c_str(), str_http_request.length(), 0);
char szBuffer[1024] = {0};
while (true)
{
int nRet = ::recv(sock, szBuffer, sizeof(szBuffer), 0);
if (nRet == 0 || nRet == WSAECONNRESET)
{
printf("Connection Closed.\n");
break;
}
else if (nRet == SOCKET_ERROR)
{
printf("socket error\n");
break;
}
else
{
printf("recv() returned %d bytes\n", nRet);
printf("received: %s\n", szBuffer);
break;
}
}
::closesocket(sock);
delete [] lrc;
return szBuffer;
}
void main() {
upload("localhost","http://localhost/upload.php","e:\/a.jpg")
}
...全文
315 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SLSnake 2012-02-23
  • 打赏
  • 举报
回复
跟踪下upload中F的值呢,就如1楼所说,你路径不对,读出来的值就不对了,你传个没内容得指针过去,不就是4个字节吗?
Isnis-fallen 2012-02-23
  • 打赏
  • 举报
回复
char **buffer 你参数是这个, 再看看你函数里的赋值
愤怒的小青年 2012-02-23
  • 打赏
  • 举报
回复
用的什么服务器,也是自己实现的吗?
老邓 2011-05-17
  • 打赏
  • 举报
回复
看起来路径上不太对劲:
upload("localhost","http://localhost/upload.php","e:\/a.jpg")
红色处改为:\\

64,680

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧