.NET Framework 技术分享,C# WEB HTTP POST 请求传文件

c# 执行 http post 请求传文件 multipart/form-data 方式

发布用户:小梦

2023/02/17 14:39


这个是文件和参数一起传递的方法,multipart/form-data 方式,这个方法稍微复杂点,因为模拟了浏览器处理分隔符等行为,一般用于传文件,代码如下:

using System;
using System.Text;
using System.Collections.Generic;
using System.Net;
using System.IO;

public class UploadFile
{
    public UploadFile()
    {
        ContentType = "application/octet-stream";
    }
    public string Name { get; set; }
    public string Filename { get; set; }
    public string ContentType { get; set; }
    public byte[] StreamContent { get; set; }
}

public string HttpPostFile(string url, IEnumerable<UploadFile> files, IDictionary<string, string> values)
{
    var request = WebRequest.Create(url);
    request.Method = "POST";
    var boundary = "------------------" + DateTime.Now.ToString("yyyyMMddHHmmss");
    request.ContentType = "multipart/form-data; boundary=" + boundary;
    boundary = "--" + boundary;
    using (var requestStream = request.GetRequestStream())
    {
        //遍历键值
        foreach (string name in values.Keys)
        {
            var buffer = Encoding.UTF8.GetBytes(boundary + Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine));
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
        }
        //遍历文件
        foreach (var file in files)
        {
            var buffer = Encoding.UTF8.GetBytes(boundary + Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine));
            requestStream.Write(buffer, 0, buffer.Length);
            buffer = Encoding.UTF8.GetBytes(string.Format("Content-Type: {0}{1}{1}", file.ContentType, Environment.NewLine));
            requestStream.Write(buffer, 0, buffer.Length);
            requestStream.Write(file.StreamContent, 0, file.StreamContent.Length);
            buffer = Encoding.UTF8.GetBytes(Environment.NewLine);
            requestStream.Write(buffer, 0, buffer.Length);
        }
        var boundaryBuffer = Encoding.UTF8.GetBytes(boundary + "--");
        requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length);
    }
    try
    {
        var stream = new MemoryStream();
        request.GetResponse().GetResponseStream().CopyTo(stream);
        return Encoding.UTF8.GetString(stream.ToArray());
    }
    catch (WebException ex)
    {
        var stream = new MemoryStream();
        ex.Response.GetResponseStream().CopyTo(stream);
        return Encoding.UTF8.GetString(stream.ToArray());
    }
}

 

一般情况下这里面的 Name、Filename 参数意义不大,完全取决于服务端如何使用,这个方法里面组合边界符和换行符的时候非常严谨,甚至换几个行都是有讲究的。



代码写多了,脑力不够用了,请我喝杯咖啡提提神 ☕

警告!禁止网络诈骗、非法集资、非法套现等法律外的缘由转账汇款,你的赞赏转账请考虑再三后支付,此收款不作任何形式的退款。





金额:

* 支付宝支付后如果没有自动返回请手动返回此页并刷新。



* 在线内容服务不支持任何形式的退款/退费操作;支付后的订单记录可以在“用户主页 - 用户订单中心”查看。

此网站可能不完全兼容您目前的浏览器!
此页随时可能被替换下线,请不要依赖此页功能!
此页正在维护更新,可能会出现错误或卡顿。
通知 & 公告

暂时还没有消息