Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
DotNETFrameworkNotesForProfessionals.pdf
Скачиваний:
32
Добавлен:
20.05.2023
Размер:
1.82 Mб
Скачать

Chapter 53: Upload file and POST data to webserver

Section 53.1: Upload file with WebRequest

To send a file and form data in single request, content should have multipart/form-data type.

using System;

using System.Collections.Generic; using System.IO;

using System.Net;

using System.Threading.Tasks;

public async Task<string> UploadFile(string url, string filename, Dictionary<string, object> postData)

{

var request = WebRequest.CreateHttp(url);

var boundary = $"{Guid.NewGuid():N}"; // boundary will separate each parameter request.ContentType = $"multipart/form-data; {nameof(boundary)}={boundary}"; request.Method = "POST";

using (var requestStream = request.GetRequestStream()) using (var writer = new StreamWriter(requestStream))

{

foreach (var data in postData)

await writer.WriteAsync( // put all POST data into request $"\r\n--{boundary}\r\nContent-Disposition: " + $"form-data; name=\"{data.Key}\"\r\n\r\n{data.Value}");

await writer.WriteAsync( // file header $"\r\n--{boundary}\r\nContent-Disposition: " +

$"form-data; name=\"File\"; filename=\"{Path.GetFileName(filename)}\"\r\n" + "Content-Type: application/octet-stream\r\n\r\n");

await writer.FlushAsync();

using (var fileStream = File.OpenRead(filename)) await fileStream.CopyToAsync(requestStream);

await writer.WriteAsync($"\r\n--{boundary}--\r\n");

}

using (var response = (HttpWebResponse) await request.GetResponseAsync()) using (var responseStream = response.GetResponseStream())

{

if (responseStream == null) return string.Empty;

using (var reader = new StreamReader(responseStream)) return await reader.ReadToEndAsync();

}

}

Usage:

var response = await uploader.UploadFile("< YOUR URL >", "< PATH TO YOUR FILE >", new Dictionary<string, object>

{

{"Comment", "test"}, {"Modified", DateTime.Now }

GoalKicker.com – .NET Framework Notes for Professionals

164

});

GoalKicker.com – .NET Framework Notes for Professionals

165