HotpimUploadDlg.cpp
上传用户:chi1060
上传日期:2014-09-13
资源大小:115k
文件大小:10k
源码类别:

TCP/IP协议栈

开发平台:

Visual C++

  1. // HotpimUploadDlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "HotpimUpload.h"
  5. #include "HotpimUploadDlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CAboutDlg dialog used for App About
  13. class CAboutDlg : public CDialog
  14. {
  15. public:
  16. CAboutDlg();
  17. // Dialog Data
  18. //{{AFX_DATA(CAboutDlg)
  19. enum { IDD = IDD_ABOUTBOX };
  20. //}}AFX_DATA
  21. // ClassWizard generated virtual function overrides
  22. //{{AFX_VIRTUAL(CAboutDlg)
  23. protected:
  24. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
  25. //}}AFX_VIRTUAL
  26. // Implementation
  27. protected:
  28. //{{AFX_MSG(CAboutDlg)
  29. //}}AFX_MSG
  30. DECLARE_MESSAGE_MAP()
  31. };
  32. CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
  33. {
  34. //{{AFX_DATA_INIT(CAboutDlg)
  35. //}}AFX_DATA_INIT
  36. }
  37. void CAboutDlg::DoDataExchange(CDataExchange* pDX)
  38. {
  39. CDialog::DoDataExchange(pDX);
  40. //{{AFX_DATA_MAP(CAboutDlg)
  41. //}}AFX_DATA_MAP
  42. }
  43. BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
  44. //{{AFX_MSG_MAP(CAboutDlg)
  45. // No message handlers
  46. //}}AFX_MSG_MAP
  47. END_MESSAGE_MAP()
  48. /////////////////////////////////////////////////////////////////////////////
  49. // CHotpimUploadDlg dialog
  50. CHotpimUploadDlg::CHotpimUploadDlg(CWnd* pParent /*=NULL*/)
  51. : CDialog(CHotpimUploadDlg::IDD, pParent)
  52. {
  53. //{{AFX_DATA_INIT(CHotpimUploadDlg)
  54. // NOTE: the ClassWizard will add member initialization here
  55. //}}AFX_DATA_INIT
  56. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  57. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  58. }
  59. void CHotpimUploadDlg::DoDataExchange(CDataExchange* pDX)
  60. {
  61. CDialog::DoDataExchange(pDX);
  62. //{{AFX_DATA_MAP(CHotpimUploadDlg)
  63. // NOTE: the ClassWizard will add DDX and DDV calls here
  64. //}}AFX_DATA_MAP
  65. }
  66. BEGIN_MESSAGE_MAP(CHotpimUploadDlg, CDialog)
  67. //{{AFX_MSG_MAP(CHotpimUploadDlg)
  68. ON_WM_SYSCOMMAND()
  69. ON_WM_PAINT()
  70. ON_WM_QUERYDRAGICON()
  71. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  72. //}}AFX_MSG_MAP
  73. END_MESSAGE_MAP()
  74. /////////////////////////////////////////////////////////////////////////////
  75. // CHotpimUploadDlg message handlers
  76. BOOL CHotpimUploadDlg::OnInitDialog()
  77. {
  78. CDialog::OnInitDialog();
  79. // Add "About..." menu item to system menu.
  80. // IDM_ABOUTBOX must be in the system command range.
  81. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
  82. ASSERT(IDM_ABOUTBOX < 0xF000);
  83. CMenu* pSysMenu = GetSystemMenu(FALSE);
  84. if (pSysMenu != NULL)
  85. {
  86. CString strAboutMenu;
  87. strAboutMenu.LoadString(IDS_ABOUTBOX);
  88. if (!strAboutMenu.IsEmpty())
  89. {
  90. pSysMenu->AppendMenu(MF_SEPARATOR);
  91. pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
  92. }
  93. }
  94. // Set the icon for this dialog.  The framework does this automatically
  95. //  when the application's main window is not a dialog
  96. SetIcon(m_hIcon, TRUE); // Set big icon
  97. SetIcon(m_hIcon, FALSE); // Set small icon
  98. // TODO: Add extra initialization here
  99. return TRUE;  // return TRUE  unless you set the focus to a control
  100. }
  101. void CHotpimUploadDlg::OnSysCommand(UINT nID, LPARAM lParam)
  102. {
  103. if ((nID & 0xFFF0) == IDM_ABOUTBOX)
  104. {
  105. CAboutDlg dlgAbout;
  106. dlgAbout.DoModal();
  107. }
  108. else
  109. {
  110. CDialog::OnSysCommand(nID, lParam);
  111. }
  112. }
  113. // If you add a minimize button to your dialog, you will need the code below
  114. //  to draw the icon.  For MFC applications using the document/view model,
  115. //  this is automatically done for you by the framework.
  116. void CHotpimUploadDlg::OnPaint() 
  117. {
  118. if (IsIconic())
  119. {
  120. CPaintDC dc(this); // device context for painting
  121. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  122. // Center icon in client rectangle
  123. int cxIcon = GetSystemMetrics(SM_CXICON);
  124. int cyIcon = GetSystemMetrics(SM_CYICON);
  125. CRect rect;
  126. GetClientRect(&rect);
  127. int x = (rect.Width() - cxIcon + 1) / 2;
  128. int y = (rect.Height() - cyIcon + 1) / 2;
  129. // Draw the icon
  130. dc.DrawIcon(x, y, m_hIcon);
  131. }
  132. else
  133. {
  134. CDialog::OnPaint();
  135. }
  136. }
  137. // The system calls this to obtain the cursor to display while the user drags
  138. //  the minimized window.
  139. HCURSOR CHotpimUploadDlg::OnQueryDragIcon()
  140. {
  141. return (HCURSOR) m_hIcon;
  142. }
  143. void CHotpimUploadDlg::OnButton1() 
  144. {
  145. // TODO: Add your control notification handler code here
  146. SendTrack();//发送数据
  147. }
  148. CString CHotpimUploadDlg::MakeRequestHeaders(CString &strBoundary)//包头
  149. {
  150.     CString strFormat;
  151.     CString strData;
  152.     
  153.     strFormat = _T("Content-Type: multipart/form-data; boundary=%srn");//二进制文件传送Content-Type类型为: multipart/form-data
  154.     
  155.     strData.Format(strFormat, strBoundary);
  156.     return strData;
  157. }
  158. CString CHotpimUploadDlg::MakePreFileData(CString &strBoundary, CString &strFileName, int iRecordID)
  159. {
  160.     /**/////////////////////////////////////////////////////////////////////////////////
  161.     //Content-Type:
  162.     //JPG image/pjpeg
  163.     //PNG image/x-png
  164.     //BMP image/bmp
  165.     //TIF image/tiff
  166.     //GIF image/gif
  167.     CString strFormat;
  168.     CString strData;
  169. strFormat += _T("--%s");
  170.     strFormat += _T("rn");
  171. strFormat += _T("Content-Disposition: form-data; name="para1"");//传给网络上的参数,根据网站抓包查看到底是需要哪些
  172.     strFormat += _T("rnrn");
  173. strFormat += _T("my name is xiaoxiong");
  174.     strFormat += _T("rn");
  175. strFormat += _T("--%s");
  176.     strFormat += _T("rn");
  177. strFormat += _T("Content-Disposition: form-data; name="para2"");
  178.     strFormat += _T("rnrn");
  179. strFormat += _T("国软软件研究所");
  180.     strFormat += _T("rn");
  181.     strFormat += _T("--%s");
  182.     strFormat += _T("rn");
  183.     strFormat += _T("Content-Disposition: form-data; name="trackdata"; filename="%s"");//文件地址信息
  184.     strFormat += _T("rn");
  185.     strFormat += _T("Content-Type: image/pjpeg");
  186.     strFormat += _T("rnrn");
  187.     strData.Format(strFormat,  strBoundary, strBoundary, strBoundary, strFileName);//
  188.     return strData;
  189. }
  190. CString CHotpimUploadDlg::MakePostFileData(CString &strBoundary)//发送请求包
  191. {
  192.     CString strFormat;
  193.     CString strData;
  194. strFormat = _T("rn");
  195.     strFormat += _T("--%s");
  196.     strFormat += _T("rn");
  197.     strFormat += _T("Content-Disposition: form-data; name="submitted"");
  198.     strFormat += _T("rnrn");
  199.     strFormat += _T("hello");
  200.     strFormat += _T("rn");
  201.     strFormat += _T("--%s--");
  202.     strFormat += _T("rn");
  203.     strData.Format(strFormat, strBoundary, strBoundary);
  204.     return strData;
  205. }
  206. BOOL CHotpimUploadDlg::SendTrack()//发送数据
  207. {
  208.     CString _mFilePath;
  209. _mFilePath = "C:\GuoRuan\pagefile.jpg";//要传的本地文件地址
  210.     int startp = _mFilePath.ReverseFind('\');
  211.     int namelen = _mFilePath.GetLength()-startp-1;
  212.    
  213.     CString pcmname = _mFilePath;//.Mid(startp+1,namelen);
  214.  
  215. //由于是公司那边的服务器,我不能把地址按公司的给你们,你们自已找个图片上传PC端软件,然后抓包,进行发送
  216. //www.GuoRuan.com这个网址是一个可以用PC端软件进行网站的文件传输,可以用抓包工具抓包查看它那边网站所要的信息对程序相应的修改
  217. //本程序已在我所在的公司测试OK
  218.     CString defServerName ="www.GuoRuan.com";//服务器名
  219.     CString defObjectName ="/system/UploadScreen/upfile_article.asp";//保存的地址
  220.  
  221.  
  222.     // USES_CONVERSION;
  223.     CInternetSession Session;
  224.     CHttpConnection *pHttpConnection = NULL;
  225.     INTERNET_PORT   nPort = 80;
  226.     CFile fTrack;
  227.     CHttpFile* pHTTP;
  228.     CString strHTTPBoundary;
  229.     CString strPreFileData;
  230.     CString strPostFileData;
  231.     DWORD dwTotalRequestLength;
  232.     DWORD dwChunkLength;
  233.     DWORD dwReadLength;
  234.     DWORD dwResponseLength;
  235.     TCHAR szError[MAX_PATH];
  236.     void* pBuffer;
  237.     LPSTR szResponse;
  238.     CString strResponse;
  239.     BOOL bSuccess = TRUE;
  240.  
  241.     CString strDebugMessage;
  242.     
  243.     if (FALSE == fTrack.Open(_mFilePath, CFile::modeRead | CFile::shareDenyWrite))//读出文件 
  244.     {
  245.       AfxMessageBox(_T("Unable to open the file."));
  246.       return FALSE;
  247.     }
  248.  
  249.     int iRecordID = 1;
  250.     strHTTPBoundary = _T("---------------------------7b4a6d158c9");//定义边界值
  251.     strPreFileData = MakePreFileData(strHTTPBoundary, pcmname, iRecordID);
  252.     strPostFileData = MakePostFileData(strHTTPBoundary);
  253.  
  254.     dwTotalRequestLength = strPreFileData.GetLength() + strPostFileData.GetLength() + fTrack.GetLength();//计算整个包的总长度
  255.  
  256.    dwChunkLength = 64 * 1024;
  257.  
  258.     pBuffer = malloc(dwChunkLength);
  259.  
  260.     if (NULL == pBuffer)
  261.     {
  262.     return FALSE;
  263.     }
  264.  
  265.      try
  266.      {
  267.       pHttpConnection = Session.GetHttpConnection(defServerName,nPort);
  268.       pHTTP = pHttpConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, defObjectName);
  269.       pHTTP->AddRequestHeaders(MakeRequestHeaders(strHTTPBoundary));//发送包头请求
  270.       pHTTP->SendRequestEx(dwTotalRequestLength, HSR_SYNC | HSR_INITIATE);
  271.       
  272.     #ifdef _UNICODE
  273.       pHTTP->Write(W2A(strPreFileData), strPreFileData.GetLength());
  274.     #else
  275.       pHTTP->Write((LPSTR)(LPCSTR)strPreFileData, strPreFileData.GetLength());//写入服务器所需信息
  276.     #endif
  277.       
  278.       dwReadLength = -1;
  279.       while (0 != dwReadLength)
  280.       {
  281.            strDebugMessage.Format(_T("%u / %un"), fTrack.GetPosition(), fTrack.GetLength());
  282.            TRACE(strDebugMessage);
  283.            dwReadLength = fTrack.Read(pBuffer, dwChunkLength);//文件内容
  284.            if (0 != dwReadLength)
  285.            {
  286.                 pHTTP->Write(pBuffer, dwReadLength);//写入服务器本地文件,用二进制进行传送
  287.            }
  288.       }
  289.       
  290.    #ifdef _UNICODE
  291.       pHTTP->Write(W2A(strPostFileData), strPostFileData.GetLength());
  292.     #else
  293.       pHTTP->Write((LPSTR)(LPCSTR)strPostFileData, strPostFileData.GetLength());
  294.     #endif
  295.       
  296.       pHTTP->EndRequest(HSR_SYNC);
  297.       
  298.       dwResponseLength = pHTTP->GetLength();
  299.       while (0 != dwResponseLength)
  300.       {
  301.        szResponse = (LPSTR)malloc(dwResponseLength + 1);
  302.        szResponse[dwResponseLength] = '';
  303.        pHTTP->Read(szResponse, dwResponseLength);
  304.        strResponse += szResponse;
  305.        free(szResponse);
  306.        dwResponseLength = pHTTP->GetLength();
  307.       }
  308.       
  309.       
  310.      } 
  311.      catch (CException* e)
  312.      {
  313.       e->GetErrorMessage(szError, MAX_PATH);
  314.       e->Delete();
  315.       AfxMessageBox(szError);
  316.       bSuccess = FALSE;
  317.      }
  318.  
  319.      pHTTP->Close();
  320.      delete pHTTP;
  321.      
  322.      fTrack.Close();
  323.      
  324.      if (NULL != pBuffer)
  325.      {
  326.       free(pBuffer);
  327.      }
  328.      return bSuccess;
  329. }