置百丈玄冰而崩裂,掷须臾池水而漂摇。

C# 上传文件和数据到后台webapi

ASP.NET 强强

今天收到一个上传文档到后台文档的需求,使用客户端模拟上传文件和对应的数据到后台服务中,后台负责保存数据


主要使用:HttpWebRequest,WebResponse 对象操作

1、 HttpWebRequest 类支持在定义 WebRequest 的属性和方法,以及使用户能够使用 HTTP 与服务器直接交互的其他属性和方法。

2、WebResponse 是 abstract 派生特定于协议的响应类的基类。 应用程序可以使用类的 WebResponse 实例以与协议无关的方式参与请求和响应事务,而派生自 WebResponse 执行请求详细信息的特定于协议的类。


上传文件的方法:

public static string Upload3(string url, string filepath, string wenjianid, string authon)
        {

            var fileName = Path.GetFileName(filepath);
            var fileContentByte = File.ReadAllBytes(filepath); // 二进制文件 

            #region 定义请求体中的内容 并转成二进制

            string boundary = "qianle";
            string Enter = "\r\n";

            string wenjianIdStr = "--" + boundary + Enter
                    + "Content-Disposition: form-data; name=\"wenjianid\"" + Enter + Enter
                    + wenjianid;
            var wenjianIdStrByte = Encoding.UTF8.GetBytes(wenjianIdStr);//wenjianid所有字符串二进制


            string fileContentStr = "Content-Type:application/octet-stream" + Enter
                    + "Content-Disposition: form-data; name=\"filename\"; filename=\"" + fileName + "\"" + Enter + Enter;
            var fileContentStrByte = Encoding.UTF8.GetBytes(fileContentStr);//fileContent一些名称等信息的二进制(不包含文件本身)
            byte[] itemBoundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); //文件开始表示
            byte[] byteEnd = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"); //结束标识 --xxxx--

            #endregion

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "multipart/form-data;boundary=" + boundary;
            request.Headers.Add("Authorization", authon);

            using (Stream myRequestStream = request.GetRequestStream())//定义请求流
            {

                #region 将各个二进制 安顺序写入请求流 wenjianIdStr  -> (itemBoundaryBytes + itemBoundaryBytesfileContentStr + fileContent+ byteEnd)  
                myRequestStream.Write(wenjianIdStrByte, 0, wenjianIdStrByte.Length);
                myRequestStream.Write(itemBoundaryBytes, 0, itemBoundaryBytes.Length);
                myRequestStream.Write(fileContentStrByte, 0, fileContentStrByte.Length);
                myRequestStream.Write(fileContentByte, 0, fileContentByte.Length);
                myRequestStream.Write(byteEnd, 0, byteEnd.Length);
                #endregion
            }
            using (WebResponse resp = request.GetResponse())
            {
                using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                {
                    string result = sr.ReadToEnd();
                    return result;
                }
            }


        }

说明:上传文件的时候需要分好顺序,有文件开头和结束的地方。

发表评论:

验证码