web-dev-qa-db-de.com

HTTP MultipartFormDataContent

Ich wurde gebeten, Folgendes in C # zu tun:

/**

* 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

* /

Ich habe Code geschrieben, der keine Fehler enthält. Die Datei ist jedoch nicht angehängt.

Kann jemand in meinem C # -Code nachsehen, ob ich den Code falsch geschrieben habe?

Hier ist mein 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

Dies wurde mehrmals bei SO gefragt. Hier sind einige mögliche Lösungen:

C # HttpClient 4.5 - Upload von Multipart-/Formulardaten: C # HttpClient 4.5 - Upload von Multipart Formulardaten - /

HttpClient-Formular für mehrteilige Formulare in C #: HttpClient-Formular für mehrteilige Formulare in C #

Überprüfen Sie in einer persönlichen Notiz die in der Anfrage gesendeten Post-Daten und überprüfen Sie die Antwort. Fiddler ist dafür hervorragend.

13
Torra

Ich weiß, dass dies ein alter Beitrag ist. Aber für diejenigen, die nach einer Lösung suchen, um eine direktere Antwort zu geben, habe ich Folgendes gefunden:

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);
        }
    }

}

Hier habe ich es gefunden http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2
Für eine aufwendigere Implementierung
http://galratner.com/blogs/net/archive/2013/03/22/ using-html-5-and-the-web-api-for-ajax-file-uploads-mit-image -Vorschau-und-ein-Fortschritt-bar.aspx

7
iuppiter

Das Veröffentlichen von MultipartFormDataContent in C # ist einfach, kann jedoch beim ersten Mal verwirrend sein .. Hier ist der Code, der für mich beim Veröffentlichen einer .png .txt-Datei usw. geeignet ist.

// 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);

In meinem Fall muss ich etwas mit dem Objekt tun, nachdem es gepostet wurde, sodass ich es mit JsonConvert in dieses Objekt konvertiere.

1
Braden Brown

Ich habe dieses Problem behoben: Das Problem ist hier:

method.Add(streamContent, "filename");

Dieses 'Hinzufügen' fügt die Datei nicht wirklich in den KÖRPER von mehrteiligem Inhalt ein.

0
A-Sharabiani