前言
最近开发过程中遇到一个需求需要在客户端发送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)]