【问题标题】:Send file+parameters in post request在 post 请求中发送文件+参数
【发布时间】:2013-09-03 08:29:43
【问题描述】:

我正在使用此代码向网页发送参数并从中获得正确的响应。

System.Net.WebClient oWeb = new System.Net.WebClient();
oWeb.Proxy = System.Net.WebRequest.DefaultWebProxy;
oWeb.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
oWeb.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
byte[] bytArguments = System.Text.Encoding.ASCII.GetBytes("value1=123&value2=xyz");
byte[] bytRetData = oWeb.UploadData("http://website.com/file.php", "POST", bytArguments);
response = System.Text.Encoding.ASCII.GetString(bytRetData);

但现在我想向它发送一个像 (.doc) 这样的文件 + 上面的参数 (value1, value2),但我不知道该怎么做。

【问题讨论】:

    标签: c# wpf file-upload webclient


    【解决方案1】:

    使用WebClient.QueryString 传递与请求关联的名称/值对。

    NameValueCollection parameters = new NameValueCollection();
    parameters.Add("value1", "123");
    parameters.Add("value2", "xyz");
    oWeb.QueryString = parameters;
    var responseBytes = oWeb.UploadFile("http://website.com/file.php", "path to file");
    string response = Encoding.ASCII.GetString(responseBytes);
    

    【讨论】:

    • 我想发布 .doc 文件,WebClient.QueryString 可以吗?
    • 请告诉我如何发送带有这些参数的实际文件(.doc)。而且我认为params 是保留字。
    • 如何通过这样做来定义文件的输入名称?
    • @HamletHakobyan 你能看到这个吗? stackoverflow.com/questions/48295877/…
    • 我试过了,但它不起作用。我认为 QueryString 仅适用于 GET 方法,但 Hongarc 的问题是“在发布请求中”。
    【解决方案2】:
        public static void HttpUploadFile(string url, string file, string paramName, string contentType, NameValueCollection nvc)
        {
            string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
            byte[] boundarybytes = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
    
            HttpWebRequest wr = (HttpWebRequest)WebRequest.Create(url);
            wr.ContentType = "multipart/form-data; boundary=" + boundary;
            wr.Method = "POST";
            wr.KeepAlive = true;
            wr.Credentials = System.Net.CredentialCache.DefaultCredentials;
            Stream rs = wr.GetRequestStream();
            string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
            foreach (string key in nvc.Keys)
            {
                rs.Write(boundarybytes, 0, boundarybytes.Length);
                string formitem = string.Format(formdataTemplate, key, nvc[key]);
                byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem);
                rs.Write(formitembytes, 0, formitembytes.Length);
            }
            rs.Write(boundarybytes, 0, boundarybytes.Length);
            string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: {2}\r\n\r\n";
            string header = string.Format(headerTemplate, paramName, file, contentType);
            byte[] headerbytes = System.Text.Encoding.UTF8.GetBytes(header);
            rs.Write(headerbytes, 0, headerbytes.Length);
            FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read);
            byte[] buffer = new byte[4096];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
            {
                rs.Write(buffer, 0, bytesRead);
            }
            fileStream.Close();
            byte[] trailer = System.Text.Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
            rs.Write(trailer, 0, trailer.Length);
            rs.Close();
            WebResponse wresp = null;
            try
            {
                wresp = wr.GetResponse();
                Stream stream2 = wresp.GetResponseStream();
                StreamReader reader2 = new StreamReader(stream2);
                result = reader2.ReadToEnd();
            }
            catch (Exception ex)
            {
                System.Windows.MessageBox.Show("Error occurred while converting file", "Error!");
                if (wresp != null)
                {
                    wresp.Close();
                    wresp = null;
                }
            }
            finally
            {
                wr = null;
            }
        }
    

    从 SO 复制但不记得它的链接。这就是它的使用方式

            NameValueCollection nvc = new NameValueCollection();
            nvc.Add("parm1", "value1");
            nvc.Add("parm2", "value2");
            nvc.Add("parm3", "value3");
            HttpUploadFile("http://www.example.com/upload.php",@filepath, "file", "text/html", nvc);
    

    这里@filepath是你要上传的文件的路径:c:\file_to_upload.doc file 是 php 中使用的文件名 $_Files['file']

    【讨论】:

    • 那么,您没有成功获得批准的答案(使用WebClient.QueryString)?
    • 谢谢。在获取帖子的 WebApi 服务中接收该信息的方式是什么?
    • 像 PHP $val1 = $_POST['parm1'];
    猜你喜欢
    • 2019-01-13
    • 1970-01-01
    • 2021-07-27
    • 2019-02-02
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多