请教:VC用Post方式上传文件到服务器问题

彩云涧 2020-06-17 05:14:29
网上有很多有关的帖子,但都是半截子,只有VC,没有Php程序,
VC+Php联合一试都不行.
分析原因主要是VC上传是没有构建Php中的$_FILES["file"]["name"],$_FILES["file"]["type"],$_FILES["file"]["size"]等信息
通过客户端Php上传程序, 用HttpWatch的抓包发现有PostData项:

通过WireShark抓包通过客户端Php上传程序,没有发现PostData项,
所以问题就卡在这里了.
目前已经用VC程序实现了Form表单Post上传以及表单参数分组功能



例如 $_POST["file"]["name"]
其实就是不知道在Post中PostData的格式.
.请大侠指教.
...全文
229 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2020-06-19
  • 打赏
  • 举报
回复
运行不正确,很简单,因为你没搞懂web编程。即不懂http post上传文件原理。 我建议小白。用libcurl 试试。应该会容易点。 要么懂post协议。socket都能做到。 还有更简单的方法。就是不用$_FILES["file"] 不用提交文件的方法。而只是post form参数。把你要上传的文件base64编码然后填入form当作普通字符串即可。小文件应该没什么问题。就算大文件。php Apache一样有最大上传文件大小限制。
Simple-Soft 2020-06-18
  • 打赏
  • 举报
回复
既然可以正常执行,那还需要什么?
彩云涧 2020-06-18
  • 打赏
  • 举报
回复
这是服务器上Php程序, 监视发现$_FILES["file"]["size"]等参数没有值.
<html>
<head>
<meta charset="GBK">
<title>文件上传结果</title>
</head>
<body>
<?php

echo $_FILES["file"]["size"] . "<br>";
echo $_FILES["file"]["type"] . "<br>";

if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 256000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

$DateTextecho= date( "Y-m-d_H-i-s" );
// echo $DateTextecho ."<br>";
$FileName = "upload/" . $DateTextecho . "_" . $_FILES["file"]["name"];

if( file_exists( $FileName))
{
echo $FileName . " already exists.<br>";
unlink( $FileName);
}
move_uploaded_file( $_FILES["file"]["tmp_name"], $FileName);
echo "Stored in: " . $FileName;
// 显示文件
echo "<br>";
echo "<img src=" . $FileName . ">";
}
} else {
echo "Invalid file";
}
?>
</body>
</html>
彩云涧 2020-06-18
  • 打赏
  • 举报
回复
这是提交表单的VC程序,测试后是可以正常执行的.
/*----------------------------------------------------------------------+
| name UpLoadByPost Ver 1.10 |
| comment 表单提交(Post方法提交表单到服务器). |
| author Zhang Yi Yun MGS Soft. 2003.02.17. |
| 2003.02.17. |
+----------------------------------------------------------------------*/
long UserWordByPost( LPCSTR pWebServerSite, LPCSTR pWebPhpName)
{ // pWebServerSite 网址
// pWebPhpName 出来程序

char *file = NULL;

Out( pWebServerSite );
Out( pWebPhpName );

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(pWebServerSite);
if( host_addr == NULL)
{
strcpy( SDPC_Result, "host_addr == NULL");
return 0;
}
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;
}
sprintf( mes, "ip address = %s, port = %d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port)); Out( mes );

std::string header( "" );
std::string content( "" );

//----------------------post头开始--------------------------------
header += "POST ";
header += pWebPhpName; // 服务器处理程序 upfile.php
header += " HTTP/1.1\r\n";

header += "Accept: */*\r\n";

header += "Referer: http://www.fansoft.cn/adv/uptab.php\r\n";

header += "Accept-Language: zh-cn\r\n";

header += "User-Agent: Mozilla/4.0\r\n";

header += "Content-Type: application/x-www-form-urlencoded\r\n";

header += "Accept-Encoding: gzip, deflate\r\n";

header += "Host: ";
header += pWebServerSite; // "localhost"
header += "\r\n";

header += "Connection: Keep-Alive\r\n";

header += "Pragma: no-cache\r\n";

content += "name=";
content += SDPC_Name;
content += "&";
content += "email=";
content += SDPC_Email;
content += "&";
content += "title=";
content += SDPC_Title;
content += "&";
content += "userword=";
content += SDPC_Userword;

char temp[64] = {0};
// 注意下面这个参数Content-Length, 这个参数值是: http请求头长度+ 请求尾长度+ 文件总长度
sprintf( temp, "Content-Length: %d\r\n\r\n", content.length() );
header += temp;
std::string str_http_request;
str_http_request.append(header).append(content);
//----------------------post头结束-----------------------------------
// 发送Post头
send( sock, str_http_request.c_str(), str_http_request.length(), 0);

static char szBuffer[1024] = {0};
int nRet;
while (true)
{
nRet = ::recv( sock, szBuffer, sizeof(szBuffer), 0);
if( nRet == 0 || nRet == WSAECONNRESET)
{
printf("Connection Closed.\n");
break;
}
else if (nRet == SOCKET_ERROR)
{
sprintf( mes, "socket error\n"); Out( mes );
break;
} else {
Out( " " );
sprintf( mes, "recv() returned %d bytes\n", nRet); Out( mes );
Out( " " );
sprintf( mes, "received: %s\n", szBuffer); Out( mes );
break;
}
}
::closesocket( sock);
delete [] file;
strcpy( SDPC_Result, szBuffer);
return 1;
}
彩云涧 2020-06-18
  • 打赏
  • 举报
回复
/*----------------------------------------------------------------------+
| name UpLoadByPost Ver 1.10 |
| comment 文件上传(Post方法上传文件到服务器). |
| author Zhang Yi Yun MGS Soft. 2003.02.17. |
| 2003.02.17. |
+----------------------------------------------------------------------*/
// Out()是自己编写的信息输出程序,用于监视信息输出.
char *UpLoadByPost0( LPCSTR pWebServerSite, LPCSTR pWebPhpName, LPCSTR pFileName)
{ // pWebServerSite 网址
// pWebPhpName 出来程序
// pFileName 待上传本地文件

char *file = NULL;

Out( pWebServerSite );
Out( pWebPhpName );
Out( pFileName );

if( !QQ_PicFileRead( &file, pFileName))
{
return "0";
}
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(pWebServerSite);
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";
}
sprintf( mes, "ip address = %s, port = %d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port)); Out( mes );

std::string header( "" );
std::string content( "" );
//----------------------post头开始--------------------------------
header += "post ";
header += pWebPhpName; // 服务器处理程序 upfile.php
header += " HTTP/1.1\r\n";
header += "Host: ";
header += pWebServerSite; // "localhost"
header += "\r\n";
header += "User-Agent: Mozilla/4.0\r\n";
header += "Connection: Keep-Alive\r\n";
header += "Accept: */*\r\n";
header += "Pragma: no-cache\r\n";
header += "Content-Type: multipart/form-data; charset=\"gb2312\"; boundary=----------------------------64b23e4066ed\r\n";

content += "------------------------------64b23e4066ed\r\n";
content += "Content-Disposition: form-data; name=\"file\"; filename=\"adv.gif1.gif\"\r\n";
// content += "Content-Type: aapplication/octet-stream\r\n\r\n";
content += "Content-Type: image/jpeg\r\n\r\n";

// post尾时间戳
std::string strContent( "\r\n------------------------------64b23e4066ed\r\n" );
char temp[64] = {0};
// 注意下面这个参数Content-Length, 这个参数值是: http请求头长度+ 请求尾长度+ 文件总长度
sprintf( temp, "Content-Length: %d\r\n\r\n", content.length()+QQ_PicFileLen+ strContent.length());
header += temp;
std::string str_http_request;
str_http_request.append(header).append(content);
//----------------------post头结束-----------------------------------
//发送post头
send( sock, str_http_request.c_str(), str_http_request.length(), 0);

char fBuff[4096];
int nPacketBufferSize = 4096; // 每个数据包存放文件的buffer大小
int nStart; // 记录post初始位置
int nSize; // 记录剩余文件大小
// 就分块传送
int i;
for( i=0; i<QQ_PicFileLen; i= i+nPacketBufferSize)
{
nStart=i;
if( i + nPacketBufferSize + 1> QQ_PicFileLen)
{
nSize = QQ_PicFileLen - i;
} else {
nSize = nPacketBufferSize;
}

memcpy( fBuff, file + nStart, nSize);
::send( sock, fBuff, nSize, 0);
Sleep(0.2);
}

::send( sock, strContent.c_str(), strContent.length(), 0);

static char szBuffer[1024] = {0};
int nRet;
while (true)
{
nRet = ::recv( sock, szBuffer, sizeof(szBuffer), 0);
if( nRet == 0 || nRet == WSAECONNRESET)
{
printf("Connection Closed.\n");
break;
}
else if (nRet == SOCKET_ERROR)
{
sprintf( mes, "socket error\n"); Out( mes );
break;
} else {
Out( " " );
sprintf( mes, "recv() returned %d bytes\n", nRet); Out( mes );
Out( " " );
sprintf( mes, "received: %s\n", szBuffer); Out( mes );
break;
}
}
::closesocket( sock);
delete [] file;
return szBuffer;
}
Simple-Soft 2020-06-17
  • 打赏
  • 举报
回复
把vc代码发出来
Simple-Soft 2020-06-17
  • 打赏
  • 举报
回复
传文件data应该是二进制的
彩云涧 2020-06-17
  • 打赏
  • 举报
回复
请问
服务器是Apache,+服务器端程序Php, PostData格式是json格式,还是是xml? 还是别的?
彩云涧 2020-06-17
  • 打赏
  • 举报
回复
服务器是Apache,接收文件的程序是Php, 客户端用php程序上传是可以, VC编写的客户端,服务器php程序没有
$_FILES["file"]["type"]等参数.
<html>
<head>
<meta charset="GBK">
<title>文件上传结果</title>
</head>
<body>
<?php
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/pjpeg"))
&& ($_FILES["file"]["size"] < 256000))
{
if ($_FILES["file"]["error"] > 0)
{
echo "Return Code: " . $_FILES["file"]["error"] . "<br>";
} else {
echo "Upload: " . $_FILES["file"]["name"] . "<br>";
echo "Type: " . $_FILES["file"]["type"] . "<br>";
echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br>";
echo "Temp file: " . $_FILES["file"]["tmp_name"] . "<br>";

$DateTextecho= date( "Y-m-d_H-i-s" );
$FileName = "upload/" . $DateTextecho . "_" . $_FILES["file"]["name"];

if( file_exists( $FileName))
{
echo $FileName . " already exists.<br>";
unlink( $FileName);
}
move_uploaded_file( $_FILES["file"]["tmp_name"], $FileName);
echo "Stored in: " . $FileName;
// 显示文件
echo "<br>";
echo "<img src=" . $FileName . ">";
}
} else {
echo "Invalid file";
}
?>
</body>
</html>
Simple-Soft 2020-06-17
  • 打赏
  • 举报
回复
postdata格式取决于服务器端要求,是json格式就传json格式数据,是xml,就传xml等

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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