http請求包里面帶文件的傳輸,請求包如何寫


  這兩天做個項目,使用http協議,之前也帶有文件的上傳,但是之前都把文件經過base64加密后,文件數據和要發送的數據拼在一塊上傳;http協議頭的Content-Type: text/json,也就是將數據組成一個json串發送出去。(PS,json是如下的類型的數據{“name":"dyt",  "name":"25"} )

  但現在文件數據不經過base64加密的了,要使用Content-Type 為”multipart/form-data”來上傳多個文件附近。這樣我就搜了網上的不少資料,的確有了不少的幫助效果。而一個高手通過jmeter來實現客戶的效果,來達到文件上傳的。

  如下圖jmeter的操作和實現的效果:

  

  

  點擊jmeter的運行之后 ,可以看到請求的body和header

  

  header如下:

  

  

  看了如上,也是使用text/json的形式來上傳數據 。那么編寫代碼就如下,不過風格有點類似於Content-Type 為”multipart/form-data”的情況。

  代碼實現部分:

void  MakeFormDataBody(CString   c_json, UploadFileMap filemap)

{

  string str_formdata;

  int i = 0;
  m_sndbody.clear(); //先清空上次的內容
  str_formdata.clear(); ////先清空上次的內容

  if (filemap.empty())
  {
    str_formdata = "Content-Disposition: form-data; name=\"data\"";
    m_sndbody += "--pzfIMNg-lMqY8r_sbn1N0RUhWY7i_ypCs\r\n" + str_formdata + "\r\n";

    m_sndbody += "Content-Type: text/plain; charset=UTF-8";
    m_sndbody += "\r\n";
    m_sndbody += "Content-Transfer-Encoding: 8bit";
    m_sndbody += "\r\n\r\n";

    m_sndbody += c_json;
    m_sndbody += "\r\n";
    m_sndbody +="--pzfIMNg-lMqY8r_sbn1N0RUhWY7i_ypCs--\r\n";
  }
  else
  {
    string mine_type;
    string filename;
    string filecontent;
    UploadFileMap::iterator it;
    str_formdata = "Content-Disposition: form-data; name=\"data\"";
    m_sndbody += "--pzfIMNg-lMqY8r_sbn1N0RUhWY7i_ypCs\r\n" + str_formdata + "\r\n";

    m_sndbody += "Content-Type: text/plain; charset=UTF-8";
    //m_sndbody += "\r\n";
    //m_sndbody += "Content-Transfer-Encoding: 8bit";
    m_sndbody += "\r\n\r\n";
    m_sndbody += c_json;
    m_sndbody += "\r\n";

    it = filemap.begin();

    for (; it!=filemap.end(); it++)
    {
      str_formdata.clear();
      mine_type.clear();
      filename.clear();
      filecontent.clear();
      str_formdata = "--pzfIMNg-lMqY8r_sbn1N0RUhWY7i_ypCs\r\n";

      str_formdata += "Content-Disposition: form-data; ";
      filename = (*it).name;
      mine_type = (*it).mine_type;
      filecontent = (*it).file_content;

      str_formdata += "name=\"" + filename + "\"; ";
      str_formdata += "filename=\"" + filename + "\"" + "\r\n";
      str_formdata += "Content-Type: " + mine_type + "\r\n";
      str_formdata += "\r\n";
      //str_formdata += "Content-Transfer-Encoding: binary";
      //str_formdata += "\r\n\r\n";

      //str_formdata += "\"" + filecontent + "\"" + "\r\n";
      str_formdata += filecontent;
      str_formdata += "\r\n";
      m_sndbody += str_formdata;

    }
    m_sndbody += "--pzfIMNg-lMqY8r_sbn1N0RUhWY7i_ypCs--";
    m_sndbody += "\r\n";

}

    注:m_sndbody就是最后發送http請求時的body,類似上圖中的request  body。

      UploadFileMap是個結構體,因為傳文件的話,要傳文件的名稱,文件的mine_type,文件的內容(也就是二進制)。

  該結構 體如下:   

  struct FileAttrib
  {
    std::string name;
    std::string mine_type;
    std::string file_content;
  };
  typedef std::vector<FileAttrib> UploadFileMap;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM