C#在WinForm下表单使用HttpWebRequest上传文件
时间: 2024-03-26 18:40:21 浏览: 12
在 C# WinForm 应用程序中,可以使用 HttpWebRequest 类来实现表单上传文件,具体步骤如下:
1. 创建 HttpWebRequest 对象,并设置请求参数。同时创建一个 NameValueCollection 对象用于存储表单数据。
```csharp
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uploadUrl);
request.Method = "POST";
request.ContentType = "multipart/form-data";
NameValueCollection formData = new NameValueCollection();
```
2. 将表单数据添加到 NameValueCollection 对象中。
```csharp
formData.Add("key1", "value1");
formData.Add("key2", "value2");
```
3. 构造要上传的文件数据。
```csharp
byte[] fileData = File.ReadAllBytes(filePath);
string fileName = Path.GetFileName(filePath);
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
string formdata = string.Format(formdataTemplate, "file", fileName);
byte[] formdataBytes = Encoding.UTF8.GetBytes(formdata);
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
```
4. 将表单数据和文件数据写入请求流中。
```csharp
Stream requestStream = request.GetRequestStream();
foreach (string key in formData.Keys)
{
string formItem = string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", key, formData[key]);
byte[] formItemBytes = Encoding.UTF8.GetBytes(formItem);
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
requestStream.Write(formItemBytes, 0, formItemBytes.Length);
}
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
requestStream.Write(formdataBytes, 0, formdataBytes.Length);
requestStream.Write(fileData, 0, fileData.Length);
byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
requestStream.Write(trailer, 0, trailer.Length);
requestStream.Close();
```
5. 发送请求并获取响应。
```csharp
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseString = reader.ReadToEnd();
reader.Close();
response.Close();
```
完整的代码示例如下:
```csharp
public void UploadFileWithForm(string uploadUrl, string filePath)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uploadUrl);
request.Method = "POST";
request.ContentType = "multipart/form-data";
NameValueCollection formData = new NameValueCollection();
formData.Add("key1", "value1");
formData.Add("key2", "value2");
byte[] fileData = File.ReadAllBytes(filePath);
string fileName = Path.GetFileName(filePath);
string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
string formdata = string.Format(formdataTemplate, "file", fileName);
byte[] formdataBytes = Encoding.UTF8.GetBytes(formdata);
byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
Stream requestStream = request.GetRequestStream();
foreach (string key in formData.Keys)
{
string formItem = string.Format("Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}", key, formData[key]);
byte[] formItemBytes = Encoding.UTF8.GetBytes(formItem);
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
requestStream.Write(formItemBytes, 0, formItemBytes.Length);
}
requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
requestStream.Write(formdataBytes, 0, formdataBytes.Length);
requestStream.Write(fileData, 0, fileData.Length);
byte[] trailer = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
requestStream.Write(trailer, 0, trailer.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string responseString = reader.ReadToEnd();
reader.Close();
response.Close();
}
```