hur.cn - 华软网

 热门搜索

用wininet函数实现http上传文件,无法上传到服务器上(大家帮忙看看)。

  作者:未知    来源:网络    更新时间:2011/7/15
我是初学者,好多东西都不怎么清楚,麻烦大侠们看看。
主要代码如下:
    Upload(m_strFilePath, _T("222.35.136.224"), _T("/interface/kedapost.aspx")
//    Upload(m_strFilePath, _T("222.35.136.224"), _T("/interface/kedapost.aspx") + m_strFileName)

BOOL CUploadDlg::Upload(CString strFilePath, CString strUrl, CString strUrlPath)
{
CFile* hFile = new CFile(strFilePath, CFile::modeRead | CFile::shareDenyNone);
DWORD fileLength = DWORD(hFile->GetLength());
m_dwFileSize = fileLength;
char * fileBuff = new char[fileLength];
hFile->Read(fileBuff,fileLength);
HINTERNET hOpen = InternetOpen(_T("HttpSendRequestEx"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hOpen == NULL)
{
AfxMessageBox(_T("Internet open failed!"));
return FALSE;
}
HINTERNET hConnect = InternetConnect(hOpen, strUrl, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL);
if(hConnect == NULL)
{
AfxMessageBox(_T("Internet connect failed!"));
return FALSE;
}
else
{
HINTERNET hRequest = HttpOpenRequest(hConnect, _T("POST"), strUrlPath, NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
if(hRequest == NULL)
{
AfxMessageBox(_T("Internet open request failed!"));
return FALSE;
}
else
{
if(!Send(hRequest, fileBuff, fileLength))
{
AfxMessageBox(_T("upload failed!"));
return FALSE;
}
else
{
//  char pBuffer[10000];
// DWORD dwBytesRead;
// do
// {    dwBytesRead = 0;
// if(InternetReadFile(hRequest, pBuffer, 9999, &dwBytesRead))
// {
// pBuffer[dwBytesRead]=0x00; // Null-terminate buffer
// //printf("%s", pcBuffer);
// }
// else
// {
// //printf("\nInternetReadFile failed");
// }
// }while(dwBytesRead>0);
// //MessageBox(_T("upload successed!"));
  }
}
InternetCloseHandle(hRequest);
}
InternetCloseHandle(hConnect);
InternetCloseHandle(hOpen);

delete []fileBuff;
hFile->Close();
delete hFile;
return TRUE;
}

BOOL CUploadDlg::Send(HINTERNET hRequest, char* fileBuf, DWORD postSize)
{
DWORD dwWrited = 0;
BOOL bFinish = TRUE;
INTERNET_BUFFERS Buffer;
Buffer.dwBufferLength = 0;
Buffer.dwBufferTotal =  postSize;
Buffer.dwHeadersLength = 0;
Buffer.dwHeadersTotal = 0;
Buffer.dwOffsetHigh = 0;
Buffer.dwOffsetLow = 0;
Buffer.dwStructSize = sizeof(INTERNET_BUFFERS);
Buffer.lpcszHeader = NULL;
Buffer.lpvBuffer = NULL;
Buffer.Next = NULL;

int nLast= (int)postSize % (1024 * 4);
int nCount= (int)postSize / (1024 * 4);
INT nSendCount = 0;
if(!HttpSendRequestEx(hRequest, &Buffer, NULL, 0,0))
{
CString str;
str.Format(_T("Error on HttpSendRequestEx %d\n"), GetLastError());
AfxMessageBox(str);
return FALSE;
}
for(int i=1;i<=nCount && bFinish; i++ )
{
bFinish = InternetWriteFile(hRequest, fileBuf + nSendCount, 1024 * 4, &dwWrited);
if(bFinish)
{
nSendCount += dwWrited;
m_dwPostSize += dwWrited;
DisplayPlan();
}
}
if(nLast != 0)
{
bFinish = InternetWriteFile(hRequest, fileBuf + nSendCount, nLast, &dwWrited);
if(bFinish)
{
nSendCount += dwWrited;
m_dwPostSize += dwWrited;
DisplayPlan();
}
}
if(!bFinish)
{
return FALSE;
}
if(!HttpEndRequest(hRequest,NULL, 0, 0))
{
return FALSE;
}
return TRUE;
}

麻烦大家帮忙看下,是不是我函数的那些参数出了问题。  我用httpanalyzerstdv5抓包工具,抓到的服务起应答不是说:“文件“/interface/kedapost.aspx”不存在”就是“request entry too large”
---华软 网友回答---
http post 上传文件不难. 关键是分析好协议。。填协议,发送.发送文件.
我上午刚把自己web服务器增加了个post上传功能.
---华软网友回复---
请问下: 需要填什么协议啊?,我弄了4、5了,焦头烂额的,麻烦帮下忙。
---华软网友回复---
http://download.csdn.net/source/3090141
---华软网友回复---
大哥们,帮忙看看代码,看下有没有漏了点什么东西。谢谢了      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。