Como 변환기 Object para MultipartFormDataContent ASP.NET

환경 요구 사항에 대한 응답 요구 사항 com 운영 환경에 대한 요구 사항 Post em uma API basta usar o método HttpClientJsonExtensions.PostAsJsonAsync(), 환경 요구 사항에 대한 응답 및 요구 사항에 대한 응답 .

A forma mais comum para en en envir formulários que contém arquivos, para uma API, é utilizando multipart/form-data, que é suportado pelo protocol http.

PostAsMultipartFormDataAsync()와 함께 사용할 수 있는 ASP.NET 기능이 없습니다. 변환기 개체, 매개 변수 및 인수, MultiPartFormDataContent 매개 변수, API 환경에서 사용할 수 있는 도구 모음.

public class MultipartFormDataContentParser<T>
{
    private T _obj;
    public MultipartFormDataContentParser(T obj)
    {
        _obj = obj;
    }
    public MultipartFormDataContent Parse()
    {
        var formContent = new MultipartFormDataContent();
        var genericFileName = "Filename";

        var propertyInfos = typeof(T).GetProperties();
        // Mount MultipartForm
        foreach (var propertyInfo in propertyInfos)
        {
            var value = propertyInfo.GetValue(_obj);
            if (value is byte[] ||
                value is Stream ||
                value is List<Stream> ||
                value is List<byte[]>)
            {
                if (value is List<Stream> listStream)
                {
                    foreach (var file in listStream)
                        if(file != null)
                            formContent.Add(new StreamContent(file), propertyInfo.Name, genericFileName);
                }else if (value is List<byte[]> listByteArray)
                {
                    foreach (var file in listByteArray)
                        if(file != null)
                            formContent.Add(new ByteArrayContent(file), propertyInfo.Name, genericFileName);
                }else
                    formContent.Add(getFileContent(value), propertyInfo.Name, genericFileName);
            }
            else if(value != null)
            {
                string output = value.ToString();
                if (!String.IsNullOrEmpty(output))
                {
                    formContent.Add(new StringContent(output), propertyInfo.Name);
                }
            }
        }
        return formContent;
    }
    private HttpContent getFileContent(object obj)
    {
        if (obj is Stream stream)
        {
            return new StreamContent(stream);
        } else if (obj is byte[] byteArray)
        {
            return new ByteArrayContent(byteArray);
        }
        else
        {
            throw new Exception("Type not valid to create a HttpContent of file");
        }
    }
}


스트림, 바이트[] e até mesmo uma lista destes tipos, como parametro de arquivo. também que o foreach busca 속성, este codigo não faz a conversão de fields를 참조하십시오.

O codigo abaixo mostra um exemplo de como utilizar.

class Program
{
    private static string _rootUrl = "http://localhost:8080/tests/formdata";

    public class ObjectForm
    {
        public string Param { get; set; }
        public List<Stream> File { get; set; }
        public ObjectForm()
        {
            File = new List<Stream>();
        }
    }
    static void Main(string[] args)
    {
        var client = new HttpClient();

        var obj = new ObjectForm();
        obj.Param = "String Param";
        obj.File.Add(new FileStream("Files/File1.txt", FileMode.Open, FileAccess.Read));
        obj.File.Add(new FileStream("Files/File2.json", FileMode.Open, FileAccess.Read));

        MultipartFormDataContent formdata = new MultipartFormDataContentParser<ObjectForm>(obj).Parse();

        HttpResponseMessage response = client.PostAsync(_rootUrl, formdata).Result;
        Console.WriteLine(response.Content.ReadAsStringAsync().Result);
    }
}

좋은 웹페이지 즐겨찾기