On m'a demandé de faire ce qui suit en 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
* /
J'ai écrit du code qui ne contient pas d'erreur, mais le fichier n'est pas joint.
Quelqu'un peut-il consulter mon code C # pour voir si j'ai mal écrit le code?
Voici mon code:
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());
Cela a été demandé à plusieurs reprises sur SO. Voici quelques solutions possibles:
C # HttpClient 4.5 téléchargement multipart/form-data: C # HttpClient 4.5 téléchargement multipart/form-data
Publication de formulaire multipart HttpClient en C #: Publication de formulaire multipart HttpClient en C #
Sur une note personnelle, vérifiez les données de publication envoyées dans la demande, puis vérifiez la réponse. Fiddler est excellent pour cela.
Je sais que ceci est un ancien post. Mais pour ceux qui recherchent une solution, pour donner une réponse plus directe, voici ce que j'ai trouvé:
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);
}
}
}
Voici où je l'ai trouvé http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2
Pour une implémentation plus élaborée
.____ preview-and-a-progress-bar.aspx
Publier MultipartFormDataContent en C # est simple, mais cela peut prêter à confusion la première fois… .. Voici le code qui fonctionne pour moi lors de la publication d'un fichier .png, 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);
Dans mon cas, j'ai besoin de faire quelque chose avec l'objet après sa publication, donc je le convertis en cet objet avec JsonConvert.
J'ai débogué ce problème est ici:
method.Add(streamContent, "filename");
Ce "Ajouter" ne met pas réellement le fichier dans le CORPS du contenu en plusieurs parties.