網上有很多有關的帖子,但都是半截子,只有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的格式.
.請大俠指教.
uj5u.com熱心網友回復:
postdata格式取決于服務器端要求,是json格式就傳json格式資料,是xml,就傳xml等uj5u.com熱心網友回復:
服務器是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="https://bbs.csdn.net/topics/ . $FileName . ">";
}
} else {
echo "Invalid file";
}
?>
</body>
</html>
uj5u.com熱心網友回復:
請問服務器是Apache,+服務器端程式Php, PostData格式是json格式,還是是xml? 還是別的?
uj5u.com熱心網友回復:
傳檔案data應該是二進制的uj5u.com熱心網友回復:
把vc代碼發出來uj5u.com熱心網友回復:
/*----------------------------------------------------------------------+| 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;
}
uj5u.com熱心網友回復:
這是提交表單的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;
}
uj5u.com熱心網友回復:
這是服務器上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="https://bbs.csdn.net/topics/ . $FileName . ">";
}
} else {
echo "Invalid file";
}
?>
</body>
</html>
uj5u.com熱心網友回復:
既然可以正常執行,那還需要什么?uj5u.com熱心網友回復:

運行不正確,很簡單,因為你沒搞懂web編程。即不懂http post上傳檔案原理。
我建議小白。用libcurl 試試。應該會容易點。
要么懂post協議。socket都能做到。
還有更簡單的方法。就是不用$_FILES["file"] 不用提交檔案的方法。而只是post form引數。把你要上傳的檔案base64編碼然后填入form當作普通字串即可。小檔案應該沒什么問題。就算大檔案。php Apache一樣有最大上傳檔案大小限制。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/11988.html
標籤:網絡編程
上一篇:程式小白一個,向大神請教,現在有個任務要求根據已有的bmp檔案來讀取像素值,進行顯示,在第一步就遇到了問題,一直加載不了bmp檔案,不知道錯誤在哪里
下一篇:在安裝Visual Studio 2019時總是顯示無法安裝microsoft.VisualStudio.Devenv.Msi是什么問題?求大神解答。該如何解決
