[C#] 客户端Post请求WebAPI上传文件

前言

最近开发过程中遇到一个需求需要在客户端发送Post请求WebAPI中已经写好的文件上传接口。WebAPI是用.Net Core写的给网站前端调用的,现在要用客户端调用由于学艺不精所以对这玩意进行了一波搜索。

首先是搜索了一番测试了一下没有可以直接使用的方法,所以我就直接打开前端网站上传文件位置查看了一下控制台network中的内容,其实前端就是直接使用form表单提交的方式。最简单的尝试,我也在客户端方法内拼装一个formdata然后转换为二进制写入然后提交请求。

客户端上传文件代码:
public static string Upload(string url, string fileName)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "POST";
    Stream postStream = new MemoryStream();
     
    //通过表单上传文件
    string boundary = "----" + DateTime.Now.Ticks.ToString("x");
    string formdataTemplate = "\r\n--" + boundary "\r\nContent-Disposition: form-data; name=\"{0}\"filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
     
    try
    {
        //准备文件流
        using (var fileStream = FileToStream(fileName))
        {
            var formdata = string.Format(formdataTemplate, "uploadFile"System.IO.Path.GetFileName(fileName/*Path.GetFileName(fileName)*/);
            var formdataBytes = Encoding.UTF8.GetBytes(postStream.Lengt== 0 ? formdata.Substring(2, formdata.Length - 2) formdata);//第一行不需要换行
            postStream.Write(formdataBytes, 0, formdataBytes.Length)
            //写入文件
            byte[] buffer = new byte[1024];
            int bytesRead = 0;
            while ((bytesRead = fileStream.Read(buffer, 0buffer.Length)) != 0)
            {
                postStream.Write(buffer, 0, bytesRead);
            }
        }
    }
    catch (Exception ex)
    {
        throw ex;
    
    //结尾
    var footer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n");
    postStream.Write(footer, 0, footer.Length);
    request.ContentType = string.Format("multipart/form-databoundary={0}", boundary);

    request.ContentLength = postStream != null ? postStream.Length : 0;
    request.Accept = "*/*";
    //request.Accept "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*;q=0.8";
    request.KeepAlive = true;
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.5Safari/537.36";
    if (postStream != null)
    {
        postStream.Position = 0
        //直接写入流
        Stream requestStream = request.GetRequestStream()
        byte[] buffer = new byte[1024];
        int bytesRead = 0;
        while ((bytesRead = postStream.Read(buffer, 0, buffer.Length)) !0)
        {
            requestStream.Write(buffer, 0, bytesRead);
        
        postStream.Close();//关闭文件访问
    }
    HttpWebResponse response = (HttpWebResponse)request.GetResponse()
    using (Stream responseStream = response.GetResponseStream())
    {
        using (StreamReader myStreamReader = neStreamReader(responseStream, Encoding.GetEncoding("utf-8")))
        {
            string retString = myStreamReader.ReadToEnd();
            return retString;
        }
    }
}
  • 请求后调试接口确实是能请求到对应的方法,可是上传文件的参数一直为null,服务端并没有接收到。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GJVYjOs1-1598849477279)(B90EA9D4320C4507B0C2F97B3B055C0E)]

  • 最后研究了一下前端代码发现,表单中的name必须和WebAPI中的参数名称对应上,然后修改后测试,结果成功了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KQDVkUSH-1598849477281)(464EC903391C4A06947CAA4EF29C84EC)]

以上内容希望对您有所帮助,谢谢关注!

猜你喜欢

转载自blog.csdn.net/weixin_44631419/article/details/108319082