wcf restful 用stream接收表单数据并解析

发布时间 2023-11-17 17:04:11作者: 赵三毛

1.下载包HttpMultipartParser

 2.服务端代码

 public bool Upload(Stream stream)
        {
            var parser = MultipartFormDataParser.Parse(stream);//解析stream
            var file = parser.Files.First();//获取文件
            string filename = file.FileName;//文件名
            var parameters = parser.Parameters;//获取参数
            Stream data = file.Data;
            string savePath = Path.Combine(Environment.CurrentDirectory, "Downloads");
            if (!Directory.Exists(savePath))
            {
                Directory.CreateDirectory(savePath);
            }
            using (FileStream fs = new FileStream(Path.Combine(savePath, filename), FileMode.Create, FileAccess.ReadWrite, FileShare.None))
            {
                byte[] buffer = new byte[4096];
                int count = 0;
                while ((count = data.Read(buffer,0,buffer.Length))>0)
                {
                    fs.Write(buffer, 0, count);
                }
                fs.Close();
                data.Close();
            }
            return true;
        }

3.测试可用postman等接口测试工具(我这里用的apifox,一样的)

4.在winform中使用

第一种用HttpClient 类上传一个MultipartFormDataContent对象,但是上传的文件名称如果有中文,服务端解析文件名称不正确。

第二种为注释里面的方法(需要安装RestSharp包,我使用的是106版本,使用未发现什么问题

  private async void btn_open_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                HttpClient http = new HttpClient();
                FileStream file = new FileStream(openFileDialog.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                // 创建一个 MultipartFormDataContent 对象
                using (MultipartFormDataContent content = new MultipartFormDataContent())
                {
                    var filename = Path.GetFileName(openFileDialog.FileName);
                    // 将 DataStream 属性作为文件流添加到内容中
                    content.Add(new StreamContent(file), "file", openFileDialog.FileName);

                    // 检查响应状态码
                    try
                    {   // 发送 POST 请求并传递类的实例
                        HttpResponseMessage response = await http.PostAsync("http://127.0.0.1:8080/post", content);
                        if (response.IsSuccessStatusCode)
                            MessageBox.Show("POST 请求成功!");
                        //var client = new RestClient("http://127.0.0.1:8080/post");
                        //client.Timeout = -1;
                        //var request = new RestRequest(Method.POST);
                        //request.AddHeader("Accept", "*/*");
                        //request.AddHeader("Host", "127.0.0.1:8080");
                        //request.AddHeader("Connection", "keep-alive");
                        //request.AddHeader("Content-Type", "multipart/form-data; boundary=--------------------------519848749455474480392777");
                        //request.AddFile("file", openFileDialog.FileName);
                        //request.AddParameter("www", "卢本伟牛逼");
                        //IRestResponse response = client.Execute(request);
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message);

                    }

                }
            }
        }