C# 如何使用HttpClient w.post发送数据和图像?

C# 如何使用HttpClient w.post发送数据和图像?,c#,php,laravel,multipartform-data,dotnet-httpclient,C#,Php,Laravel,Multipartform Data,Dotnet Httpclient,我需要使用HttpClient执行post方法,并将其捕获到我的PHP web服务中 第一次,我开始使用FormUrlEncodedContent,没关系,我的web服务收到了这些数据。但现在我需要用户捕获一个图像并将其放入字节数组中 对于这一点,我想MultipartFormDataContent是这里的英雄。这就是我所拥有的 Dictionary<string, string> @params = new Diction ... byte[] im

我需要使用
HttpClient
执行post方法,并将其捕获到我的PHP web服务中

第一次,我开始使用FormUrlEncodedContent,没关系,我的web服务收到了这些数据。但现在我需要用户捕获一个图像并将其放入字节数组中

对于这一点,我想MultipartFormDataContent是这里的英雄。这就是我所拥有的

        Dictionary<string, string> @params = new Diction ...
        byte[] imageData = ...

        var requestContent = new MultipartFormDataContent();
        requestContent.Add(new FormUrlEncodedContent(@params));
        requestContent.Add(new ByteArrayContent(imageData));

        HttpClient client = new HttpClient();
        HttpResponseMessage response = await client.PostAsync(request, requestContent);
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();
Dictionary@params=新词汇。。。
字节[]图像数据=。。。
var requestContent=new MultipartFormDataContent();
Add(新FormUrlEncodedContent(@params));
Add(新的ByteArrayContent(imageData));
HttpClient=新的HttpClient();
HttpResponseMessage response=wait client.PostAsync(请求,请求内容);
response.EnsureSuccessStatusCode();
string responseBody=wait response.Content.ReadAsStringAsync();
但当我收到回复时,我得到以下信息:

ResponseBy“
\n警告:文件上载Mime头 第0行
\n{\“..”字符串中的未知内容被乱码


我不知道php代码或我的c#代码中是否有问题。

我们也有类似的问题,我们必须摆脱HttpClient,因为它不是很灵活。在我们的情况下,我们必须将多个文件上传到服务器。我们最终使用了WebRequest。下面是工作代码。看看PostMultipart函数-其他一切都是h埃尔伯斯

public class UploadFile
{
    public UploadFile(Stream data, string fieldName, string fileName, string contentType)
    {
        this.Data = data;
        this.FieldName = fieldName;
        this.FileName = fileName;
        this.ContentType = contentType;
    }

    public UploadFile(string fileAbsPath, string fieldName, string fileName, string contentType)
        : this(File.OpenRead(fileAbsPath), fieldName, fileName, contentType)
    {
    }

    public UploadFile(string fileAbsPath, string fieldName, string contentType)
        : this(fileAbsPath, fieldName, Path.GetFileName(fileAbsPath), contentType)
    {
    }


    public UploadFile(string fileAbsPath)
        : this(fileAbsPath, null, Path.GetFileName(fileAbsPath), "application/octet-stream")
    {
    }

    public Stream Data { get; set; }

    public string FieldName { get; set; }

    public string FileName { get; set; }

    public string ContentType { get; set; }

    public DateTimeOffset? CreationDate { get; set; }

    public DateTimeOffset? ModificationDate { get; set; }
}

class MimePart
{
    private readonly NameValueCollection headers = new NameValueCollection();
    private byte[] header;

    private Stream data;

    public override Stream Data
    {
        get
        {
            return this.data;
        }
    }

    public void SetStream(Stream stream)
    {
        this.data = stream;
    }

    public NameValueCollection Headers
    {
        get { return this.headers; }
    }

    public byte[] Header
    {
        get { return this.header; }
    }

    public long GenerateHeaderFooterData(string boundary)
    {
        var sb = new StringBuilder();
        sb.Append("--");
        sb.Append(boundary);
        sb.AppendLine();

        foreach (string key in this.headers.AllKeys)
        {
            sb.Append(key);
            sb.Append(": ");
            sb.AppendLine(this.headers[key]);
        }

        sb.AppendLine();

        this.header = Encoding.UTF8.GetBytes(sb.ToString());

        return this.header.Length + this.Data.Length + 2;
    }
}

private IList<MimePart> GenerateMimePartsList(IEnumerable<UploadFile> files)
{
    var mimeParts = new List<MimePart>();

    int nameIndex = 0;

    // Files data
    foreach (UploadFile file in files)
    {
        var streamMimePart = new StreamMimePart();

        if (string.IsNullOrEmpty(file.FieldName))
        {
            file.FieldName = "file" + nameIndex++;
        }

        var contentDispositionValues = new List<string>();
        contentDispositionValues.Add("form-data");
        contentDispositionValues.Add(string.Format("name=\"{0}\"", file.FieldName));
        contentDispositionValues.Add(string.Format("filename=\"{0}\"", file.FileName));

        if (file.CreationDate.HasValue)
        {
            contentDispositionValues.Add(string.Format("creation-date=\"{0}\"", file.CreationDate.Value.ToString("R")));
        }

        if (file.ModificationDate.HasValue)
        {
            contentDispositionValues.Add(string.Format("modification-date=\"{0}\"", file.ModificationDate.Value.ToString("R")));
        }

        // "form-data; name=\"" + file.FieldName + "\"; filename=\"" + file.FileName + "\"";
        streamMimePart.Headers["Content-Disposition"] = string.Join("; ", contentDispositionValues);
        streamMimePart.Headers["Content-Type"] = file.ContentType;
        streamMimePart.SetStream(file.Data);

        mimeParts.Add(streamMimePart);
    }

    return mimeParts;
}

public void PostMultipart(Uri uri, IEnumerable<UploadFile> files)
{
    var mimeParts = this.GenerateMimePartsList(files);

    var boundary = "----------" + DateTime.Now.Ticks.ToString("x");

    byte[] footer = Encoding.UTF8.GetBytes("--" + boundary + "--\r\n");

    var request = (HttpWebRequest)WebRequest.Create(uri);
    request.Method = "POST";
    request.ContentType = "multipart/form-data; boundary=" + boundary;
    request.ContentLength = mimeParts.Sum(part => part.GenerateHeaderFooterData(boundary)) + footer.Length;
    try
    {
        // Write data
        byte[] buffer = new byte[8192];
        byte[] afterFile = Encoding.UTF8.GetBytes("\r\n");

        using (Stream requestStream = request.GetRequestStream())
        {
            foreach (MimePart mimePart in mimeParts)
            {
                requestStream.Write(mimePart.Header, 0, mimePart.Header.Length);

                int read;
                while ((read = mimePart.Data.Read(buffer, 0, buffer.Length)) > 0)
                {
                    requestStream.Write(buffer, 0, read);
                }

                mimePart.Data.Dispose();

                requestStream.Write(afterFile, 0, afterFile.Length);
            }

            requestStream.Write(footer, 0, footer.Length);
        }

        // Get response 
        using (var response = (HttpWebResponse)request.GetResponse())
        {
            var responseText = response.ReadAsString();


            return;
        }
    }
    catch (WebException webException)
    {
        this.HandleErrorResponse(webException);
    }
    finally
    {
        foreach (var mimePart in mimeParts)
        {
            if (mimePart.Data != null)
            {
                mimePart.Data.Dispose();
            }
        }
    }

    return;
}
公共类上传文件
{
公共上载文件(流数据、字符串字段名、字符串文件名、字符串内容类型)
{
这个。数据=数据;
this.FieldName=字段名;
this.FileName=文件名;
this.ContentType=ContentType;
}
公共上载文件(字符串文件AbsPath、字符串字段名、字符串文件名、字符串内容类型)
:this(File.OpenRead(fileAbsPath)、字段名、文件名、contentType)
{
}
公共上载文件(字符串文件路径、字符串字段名、字符串内容类型)
:此(fileAbsPath、fieldName、Path.GetFileName(fileAbsPath)、contentType)
{
}
公共上载文件(字符串fileAbsPath)
:this(fileAbsPath,null,Path.GetFileName(fileAbsPath),“应用程序/八位字节流”)
{
}
公共流数据{get;set;}
公共字符串字段名{get;set;}
公共字符串文件名{get;set;}
公共字符串ContentType{get;set;}
公共日期时间偏移量?CreationDate{get;set;}
公共DateTimeOffset?修改日期{get;set;}
}
类MimePart
{
私有只读NameValueCollection标头=新的NameValueCollection();
专用字节[]头;
私有流数据;
公共覆盖流数据
{
得到
{
返回此.data;
}
}
公共流(流)
{
这个.data=stream;
}
public NameValueCollection标头
{
获取{返回this.headers;}
}
公共字节[]头
{
获取{返回this.header;}
}
公共长GenerateHeaderFooterData(字符串边界)
{
var sb=新的StringBuilder();
某人加上(“—”);
某人附加(边界);
(某人);
foreach(this.headers.AllKeys中的字符串键)
{
某人附加(钥匙);
某人加上(“:”);
sb.AppendLine(此标题[键]);
}
(某人);
this.header=Encoding.UTF8.GetBytes(sb.ToString());
返回this.header.Length+this.Data.Length+2;
}
}
私有IList GenerateMimePartsList(IEnumerable文件)
{
var mimeParts=新列表();
int nameIndex=0;
//文件数据
foreach(文件中的上载文件)
{
var streamMimePart=新streamMimePart();
if(string.IsNullOrEmpty(file.FieldName))
{
file.FieldName=“file”+nameIndex++;
}
var contentDispositionValues=新列表();
contentDispositionValues.Add(“表单数据”);
contentDispositionValues.Add(string.Format(“name=\”{0}\”,file.FieldName));
contentDispositionValues.Add(string.Format(“filename=\”{0}\”,file.filename));
if(file.CreationDate.HasValue)
{
contentDispositionValues.Add(string.Format(“创建日期=\”{0}\”,file.CreationDate.Value.ToString(“R”));
}
if(file.ModificationDate.HasValue)
{
contentDispositionValues.Add(string.Format(“修改日期=\”{0}\”,file.ModificationDate.Value.ToString(“R”));
}
//“表单数据;名称=\”“+file.FieldName+”\“文件名=\”“+file.filename+”\”;
streamMimePart.Headers[“Content Disposition”]=string.Join(“;”,contentDispositionValues);
streamMimePart.Headers[“Content Type”]=file.ContentType;
streamMimePart.SetStream(file.Data);
添加(streamMimePart);
}
退货零件;
}
公共void PostMultipart(Uri、IEnumerable文件)
{
var mimeParts=this.generateMememePartsList(文件);
var boundary=“------------”+DateTime.Now.Ticks.ToString(“x”);
byte[]footer=Encoding.UTF8.GetBytes(“--”+boundary+”--\r\n”);
var request=(HttpWebRequest)WebRequest.Create(uri);
request.Method=“POST”;
request.ContentType=“多部分/表单数据;boundary=“+boundary;
request.ContentLength=mimeParts.Sum(part=>part.GenerateHeaderFooterData(boundary))+footer.Length;
尝试
{
//写入数据
字节[]缓冲区=新字节[8192];
字节[]afterFile=Encoding.UTF8.GetBytes(“\r\n”);
使用(Stream requestStream=request.GetRequestStream())
{
foreach(MimePart-MimePart-in-MimePart)
{
Write(mimePart.Header,0,mimePart.Header.Length);
int-read;
而((read=mimePart.Data.read(buffer,0,buffer.Length))>0)
{
requestStream.Write(缓冲区,