c# WebRequest multipart/form-data GET或POST请求

本文章主要介绍WebRequest multipart/form-data,POSTGET两种请求方式

multipart/form-data POST 传文件或表单参数

使用WebRequest发送multipart/form-data类型请求,传递文件或数据参数
首先我们需要创建一个辅助类MsMultiPartFormData
话不多说,直接上代码,

MsMultiPartFormData

    public class MsMultiPartFormData
    {
        private List<byte> formData;
        public String Boundary = "---------------------------7db1851cd1158";
        private String fieldName = "Content-Disposition: form-data; name=\"{0}\"";
        private String fileContentType = "Content-Type: {0}";
        private String fileField = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"";
        private Encoding encode = Encoding.GetEncoding("UTF-8");
        public MsMultiPartFormData()
        {
            formData = new List<byte>();
        }
        public void AddFormField(String FieldName, String FieldValue)
        {
            String newFieldName = fieldName;
            newFieldName = string.Format(newFieldName, FieldName);
            formData.AddRange(encode.GetBytes("--" + Boundary + "\r\n"));
            formData.AddRange(encode.GetBytes(newFieldName + "\r\n\r\n"));
            formData.AddRange(encode.GetBytes(FieldValue + "\r\n"));
        }
        public void AddFile(String FieldName, String FileName, byte[] FileContent, String ContentType)
        {
            String newFileField = fileField;
            String newFileContentType = fileContentType;
            newFileField = string.Format(newFileField, FieldName, FileName);
            newFileContentType = string.Format(newFileContentType, ContentType);
            formData.AddRange(encode.GetBytes("--" + Boundary + "\r\n"));
            formData.AddRange(encode.GetBytes(newFileField + "\r\n"));
            formData.AddRange(encode.GetBytes(newFileContentType + "\r\n\r\n"));
            formData.AddRange(FileContent);
            formData.AddRange(encode.GetBytes("\r\n"));
        }
        public void AddStreamFile(String FieldName, String FileName, byte[] FileContent)
        {
            AddFile(FieldName, FileName, FileContent, "application/vnd.openxmlformats-officedocument.wordprocessingml.document");
        }
        public void PrepareFormData()
        {
            formData.AddRange(encode.GetBytes("--" + Boundary + "--"));
        }
        public List<byte> GetFormData()
        {
            return formData;
        }
    }

最后直接开始进行post请求即可

        /// <summary>
        /// 创建合同文档
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <param name="fullName">文件全路径</param>
        /// <returns></returns>
        public JObject WebRequestPost(string url, string fileName, string fullName)
        {
            WebRequest request = WebRequest.Create(url);
            MsMultiPartFormData form = new MsMultiPartFormData();
            FileStream file = new FileStream(fullName, FileMode.Open);
            byte[] bt = new byte[file.Length];
            file.Read(bt, 0, (int)file.Length);
            file.Close();

            // 添加文件
            form.AddStreamFile("file", fileName, bt);
            // 添加表单参数
            form.AddFormField("title", fileName.Split('.')[0]);
            form.AddFormField("fileType", fileName.Split('.')[1]);
            form.PrepareFormData();

            // 添加头部信息
            request.Headers.Add("x-qys", 'sig');
            request.ContentType = "multipart/form-data; boundary=" + form.Boundary;
            request.Method = "POST";

            Stream stream = request.GetRequestStream();
            foreach (var b in form.GetFormData())
            {
                stream.WriteByte(b);
            }
            stream.Close();
            WebResponse response = request.GetResponse();

            Stream s = response.GetResponseStream();
            StreamReader sr = new StreamReader(s, Encoding.Default);
            string res = sr.ReadToEnd();

            // 字符串转JObject对象
            jobj = SerializeUtil.JsonDeserialize<JObject>(res);
          
            return jobj;
        }

WebRequest GET请求方式

        /// <summary>
        /// Get
        /// </summary>
        /// <param name="url">请求地址</param>
        /// <returns></returns>
        public void Get(string url)
        {   
            // 参数通过url传递
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = "GET";
            req.ContentType = "multipart/form-data";
            // 设置头部信息
            WebHeaderCollection header = new WebHeaderCollection();
            header.Add("x-qys", 'sig');
            req.Headers = header;

            // 获取返回字符串数据
            WebResponse response = req.GetResponse();
            StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
            string res = sr.ReadToEnd();
            jobj = MyLib.SerializeUtil.JsonDeserialize<JObject>(res);
            
            
            // 也可以获取流压缩成zip进行保存
            string savePath="";// 服务器保存路径
            using (WebResponse wr = req.GetResponse())
            {
                Stream str = wr.GetResponseStream();
                #region 获取流生成ZIP文件
                using (FileStream fileStream = new FileStream(savePath, FileMode.Create, FileAccess.Write))
                {
                    int size = 2048;
                    byte[] data = new byte[2048];
                    while (true)
                    {
                        size = str.Read(data, 0, data.Length);
                        if (size > 0)
                        { fileStream.Write(data, 0, size); }
                        else
                        {
                            break;
                        }
                    }
                }
                #endregion
            }
        }
posted @   亘古不变  阅读(65)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示