📜  带有文件的 C# http post 请求 - C# (1)

📅  最后修改于: 2023-12-03 15:25:27.546000             🧑  作者: Mango

带有文件的 C# HTTP POST 请求

在一些场景下,我们需要向服务器发送一些数据或文件,这时候就需要使用 HTTP POST 请求。C# 提供了很多方式来发送 HTTP POST 请求,例如使用 HttpWebRequestWebClient 等。

方式一:使用 HttpWebRequest

使用 HttpWebRequest 发送 POST 请求需要以下步骤:

  1. 创建 HttpWebRequest 对象,设置请求 URL 和请求方法为 POST。
  2. 设置请求内容类型和请求长度。
  3. 写入请求正文。
  4. 发送请求并获取响应。

下面展示一个带有文件的 HTTP POST 请求示例:

string url = "https://example.com/upload";
string filePath = @"C:\Users\JohnDoe\Documents\example.png";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";

string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
request.ContentType = "multipart/form-data; boundary=" + boundary;

Stream requestStream = request.GetRequestStream();
FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[4096];
int bytesRead;
string fileHeader = $"--{boundary}\r\nContent-Disposition: form-data; name=\"file\"; filename=\"{Path.GetFileName(filePath)}\"\r\nContent-Type: image/png\r\n\r\n";
byte[] fileHeaderBytes = Encoding.UTF8.GetBytes(fileHeader);
requestStream.Write(fileHeaderBytes, 0, fileHeaderBytes.Length);

while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
{
    requestStream.Write(buffer, 0, bytesRead);
}

string boundaryFooter = $"\r\n--{boundary}--\r\n";
byte[] boundaryFooterBytes = Encoding.UTF8.GetBytes(boundaryFooter);
requestStream.Write(boundaryFooterBytes, 0, boundaryFooterBytes.Length);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

在此示例中,我们首先定义了 urlfilePath 两个参数,分别代表请求 URL 和文件路径。然后我们通过 HttpWebRequest.Create 方法创建了 HttpWebRequest 对象,并设置了请求方法为 POST。

我们在第 3 行创建了一个字符串 boundary,它用于分隔请求的不同部分。我们将请求的内容类型设置为 multipart/form-data,并在其中添加了 boundary 参数。

在第 8 行,我们调用了 request.GetRequestStream 方法获取请求写入流,并创建了一个 FileStream 对象读取文件数据。我们使用 buffer 字节数组来读取文件数据,每次最多读取 4096 个字节,然后将读取到的字节写入请求写入流。

在第 15 行,我们设置了请求结束的 boundary 并将其写入请求写入流。最后,我们调用 request.GetResponse 方法发送请求并获取响应。

方式二:使用 WebClient

另外一种发送 HTTP POST 请求的方法是使用 WebClient。这种方式比较简单,只需要一行代码即可完成请求。

下面是一个使用 WebClient 发送带有文件的 HTTP POST 请求的示例:

string url = "https://example.com/upload";
string filePath = @"C:\Users\JohnDoe\Documents\example.png";

NameValueCollection values = new NameValueCollection();
values.Add("fileName", Path.GetFileName(filePath));
byte[] response = new WebClient().UploadFile(url, filePath);

在此示例中,我们定义了 urlfilePath 两个参数,分别代表请求 URL 和文件路径。然后我们创建了一个 NameValueCollection 对象来存储文件名参数,使用 WebClient.UploadFile 方法上传文件,并获取服务器响应。

总结

无论是使用 HttpWebRequest 还是 WebClient,在发送带有文件的 HTTP POST 请求时,我们都需要注意请求内容类型和请求长度的设置,以及文件数据的写入方式。同时需要在请求结束时关闭相关流。