web-dev-qa-db-fra.com

Http MultipartFormDataContent

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());
12
user2985419

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.

13
Torra

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

7
iuppiter

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.

1
Braden Brown

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.

0
A-Sharabiani