Протокол HTTP MultipartFormDataContent
меня попросили сделать следующее В C#:
/**
* 1. Create a MultipartPostMethod
* 2. Construct the web URL to connect to the SDP Server
* 3. Add the filename to be attached as a parameter to the MultipartPostMethod with parameter name "filename"
* 4. Execute the MultipartPostMethod
* 5. Receive and process the response as required
* /
Я написал некоторый код, который не имеет никаких ошибок, но файл не прикрепляется.
может кто-нибудь взглянуть на мой код C#, чтобы увидеть, если я написал код неправильно?
вот мой код:
var client = new HttpClient();
const string weblinkUrl = "http://testserver.com/attach?";
var method = new MultipartFormDataContent();
const string fileName = "C:file.txt";
var streamContent = new StreamContent(File.Open(fileName, FileMode.Open));
method.Add(streamContent, "filename");
var result = client.PostAsync(weblinkUrl, method);
MessageBox.Show(result.Result.ToString());
4 ответов
Это было задано несколько раз на SO. Вот некоторые возможные решения:
C# HttpClient 4.5 multipart / form-загрузка данных:C# HttpClient 4.5 multipart / form-загрузка данных
HttpClient многостраничная форма сообщение в C#:HttpClient многостраничная форма сообщение в C#
на личной заметке проверьте данные post, отправляемые в запросе, и проверьте ответ. Саша отлично подходит для этого.
Я знаю, что это старый пост, но для тех, кто ищет решение, чтобы дать более прямой ответ, вот что я нашел:
using System.Diagnostics;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
public class UploadController : ApiController
{
public async Task<HttpResponseMessage> PostFormData()
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// This illustrates how to get the file names.
foreach (MultipartFileData file in provider.FileData)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine("Server file path: " + file.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
}
вот где я его нашел
http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-часть-2
для более сложной implementation
http://galratner.com/blogs/net/archive/2013/03/22/using-html-5-and-the-web-api-for-ajax-file-uploads-with-image-preview-and-a-progress-bar.aspx
разноска MultipartFormDataContent в C# проста, но может быть запутанной в первый раз. Вот код, который работает для меня при проводке .формат PNG. txt etc.
// 2. Create the url
string url = "https://myurl.com/api/...";
string filename = "myFile.png";
// In my case this is the JSON that will be returned from the post
string result = "";
// 1. Create a MultipartPostMethod
// "NKdKd9Yk" is the boundary parameter
using (var formContent = new MultipartFormDataContent("NKdKd9Yk")) {
content.Headers.ContentType.MediaType = "multipart/form-data";
// 3. Add the filename C:\... + fileName is the path your file
Stream fileStream = System.IO.File.OpenRead("C:\Users\username\Pictures\" + fileName);
content.Add(new StreamContent(fileStream), fileName, fileName);
using (var client = new HttpClient())
{
// Bearer Token header if needed
client.DefaultRequestHeaders.Add("Authorization", "Bearer " + _bearerToken);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("multipart/form-data"));
try
{
// 4.. Execute the MultipartPostMethod
var message = await client.PostAsync(url, formContent);
// 5.a Receive the response
result = await message.Content.ReadAsStringAsync();
}
catch (Exception ex)
{
// Do what you want if it fails.
throw ex;
}
}
}
// 5.b Process the reponse Get a usable object from the JSON that is returned
MyObject myObject = JsonConvert.DeserializeObject<MyObject>(result);
в моем случае мне нужно что-то сделать с объектом после его сообщений, поэтому я преобразую его в этот объект с помощью JsonConvert.
Я отладил эту проблему здесь:
method.Add(streamContent, "filename");
Это "добавить" на самом деле не помещает файл в тело составного содержимого.