Http MultipartFormDataContent

use*_*419 15 c# post multipartform-data httpclient filestream

我被要求在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

* /
Run Code Online (Sandbox Code Playgroud)

我写了一些没有错误的代码,但是没有附加文件.

有人可以查看我的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());
Run Code Online (Sandbox Code Playgroud)

Bra*_*own 21

在 C# 中发布 MultipartFormDataContent 很简单,但第一次可能会令人困惑。这是发布 .png .txt 等时对我有用的代码。

// 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"))
{
    formContent.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);
    formContent.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);
Run Code Online (Sandbox Code Playgroud)

就我而言,我需要在对象发布后对其进行处理,因此我使用 JsonConvert 将其转换为该对象。

  • 什么是‘内容’?与“formContent”相同吗? (2认同)

小智 6

我知道这是一个老帖子但是对于那些寻求解决方案的人来说,提供一个更直接的答案,这就是我发现的:

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

}
Run Code Online (Sandbox Code Playgroud)

这是我发现它的地方 http://www.asp.net/web-api/overview/advanced/sending-html-form-data,-part-2
有关更精细的实施
http://galratner.com/blogs/净/存档/ 2013/03 /第22 /使用-HTML-5和最Web的API换Ajax的文件上传,与图像预览和-A-进步,bar.aspx

  • 这*读取*多部分/表单数据,而不*发送*它。我想知道您是否读过甚至不涉及ASP.NET Web API的问题 (3认同)
  • @iuppiter 我已经多次见过 C# 客户端了,我的朋友。任何想要向服务器发送数据或从服务器接收数据的客户端 C# 应用程序都需要编写客户端代码。我还在这里再次看到它,在作者的问题中,在这一行:“client.PostAsync(weblinkUrl, method);” 这是尝试向服务器发送发布请求的客户端代码。干净利落。另一方面,您的代码是服务器端代码,它接收多部分发布请求并从中“读取”附加文件。你和作者可以一起创建一个网络应用程序,你做服务器端,他做客户端。 (3认同)

A-S*_*ani 1

我调试了一下,问题出在这里:

method.Add(streamContent, "filename");
Run Code Online (Sandbox Code Playgroud)

此“添加”实际上并未将文件放入多部分内容的主体中。