這兩天做個項目,使用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;