c#代碼,類比form表單發送post請求,上傳檔案(並帶其他參數)

來源:互聯網
上載者:User

標籤:--   utf-8   損壞   height   files   代碼   亂碼   sts   htm   

本人對post理解不深,前段時間遇到一個需要用c#代碼發送post請求上傳檔案的業務,於是參考了幾篇文章,加上自身實踐寫出了如下代碼。寫的比較low 望各位大大指正^_^。

業務需求:

對方給了一個介面,讓傳四個參數分別為“modelId、fileContent、updateTime、encrypt”

其中modelId、updateTime、encrypt 都是普通的字串類型。fileContent則是二進位檔案

我實在是不瞭解post的相關知識,平時只是普通的用法,沒有深層看過相關知識。

於是我用html頁面寫一個form表單提交,然後攔截一下查看了要求標頭請求體中的內容(這隻是傳一個普通的文字檔所以fileConten中能顯示普通文本,如果是圖片之類的檔案這裡都是亂碼)。

這裡面畫圈圈的都是我認為比較重要的地方。

看這些資訊 我得出

要求標頭中:

content-Type: multipart/form-data

boundary=ceshi感覺應該是分隔字元的意思,“ceshi”是我隨便寫的

請求體中是按照一定格式拼的串,大致就是--ceshi **** --ceshi  **** --ceshi  **** --ceshi-- 這樣的格式。

因為最終是發送請求流,這些請求體中的內容都需要寫進請求流中,雖然有些事字串這種文本類型的資料,但是檔案本身是二進位的,所以我就把所有文本都變成了二進位再加上檔案本身

然後按照這種格式的順序寫入請求流中,最後發送出去(如果不變成二進位,則只能進行文本類型的檔案上傳,限制很多,並且容易損壞檔案)。

代碼如下:

把C盤下的2.html檔案發送了出去(圖片、pdf 等類型也是可用的,因為都是轉成了二進位)已經過測試

private void post1()        {            string url = @"http://*******";//這裡就不暴露我們的地址啦            string modelId = "4f1e2e3d-6231-4b13-96a4-835e5af10394";            string updateTime = "2016-11-03 14:17:25";            string encrypt = "f933797503d6e2c36762428a280e0559";            string filePath = @"C:/2.html";            string fileName = "2.html";            byte[] fileContentByte = new byte[1024]; // 檔案內容二進位            #region 將檔案轉成二進位            FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);            fileContentByte = new byte[fs.Length]; // 二進位檔案            fs.Read(fileContentByte, 0, Convert.ToInt32(fs.Length));            fs.Close();            #endregion            #region 定義請求體中的內容 並轉成二進位            string boundary = "ceshi";            string Enter = "\r\n";            string modelIdStr = "--" + boundary + Enter                    + "Content-Disposition: form-data; name=\"modelId\"" + Enter + Enter                    + modelId + Enter;            string fileContentStr = "--" + boundary + Enter                    + "Content-Type:application/octet-stream" + Enter                    + "Content-Disposition: form-data; name=\"fileContent\"; filename=\"" + fileName + "\"" + Enter + Enter;            string updateTimeStr = Enter + "--" + boundary + Enter                    + "Content-Disposition: form-data; name=\"updateTime\"" + Enter + Enter                    + updateTime;            string encryptStr = Enter + "--" + boundary + Enter                    + "Content-Disposition: form-data; name=\"encrypt\"" + Enter + Enter                    + encrypt + Enter + "--" + boundary + "--";            var modelIdStrByte = Encoding.UTF8.GetBytes(modelIdStr);//modelId所有字串二進位            var fileContentStrByte = Encoding.UTF8.GetBytes(fileContentStr);//fileContent一些名稱等資訊的二進位(不包含檔案本身)            var updateTimeStrByte = Encoding.UTF8.GetBytes(updateTimeStr);//updateTime所有字串二進位                        var encryptStrByte = Encoding.UTF8.GetBytes(encryptStr);//encrypt所有字串二進位            #endregion            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);            request.Method = "POST";            request.ContentType = "multipart/form-data;boundary=" + boundary;             Stream myRequestStream = request.GetRequestStream();//定義請求流            #region 將各個二進位 安順序寫入請求流 modelIdStr -> (fileContentStr + fileContent) -> uodateTimeStr -> encryptStr            myRequestStream.Write(modelIdStrByte, 0, modelIdStrByte.Length);            myRequestStream.Write(fileContentStrByte, 0, fileContentStrByte.Length);            myRequestStream.Write(fileContentByte, 0, fileContentByte.Length);            myRequestStream.Write(updateTimeStrByte, 0, updateTimeStrByte.Length);            myRequestStream.Write(encryptStrByte, 0, encryptStrByte.Length);            #endregion            HttpWebResponse response = (HttpWebResponse)request.GetResponse();//發送            Stream myResponseStream = response.GetResponseStream();//擷取傳回值            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));            string retString = myStreamReader.ReadToEnd();            myStreamReader.Close();            myResponseStream.Close();        }

代碼測試過,已經使用了。這個是修改版,刪除了一些其他東西,僅是借鑒作用。

如有不足,請各位大大指正。

c#代碼,類比form表單發送post請求,上傳檔案(並帶其他參數)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.