在C#中使用WebClient通过多部分表单数据上传文件

时间:2019-04-05 09:19:55

标签: c# file-upload webclient multipartform-data

有人可以告诉我如何以multipart-form-data格式上传文件,以便我可以添加post-params和文件作为内容。

1 个答案:

答案 0 :(得分:0)

如果您同时需要有效负载中的files和对象,则可以使用multipart形式,如下所示:

表格

<form id="createForm" method="post" enctype="multipart/form-data" action="http://localhost:5000/api/send">
<input type="text" name="Field1"  id="field1" />
<input type="text" name="Field2"  id="field2" />
<input type="file" id="bulk" name="Bulk" required />
</form>

POCO

class MyClass
{
  public string Field1{get;set;}
  public string Field2{get;set;}
}

控制器
在控制器中,您可以使用Request.Form.Files访问文件,这会为您提供所有已上传文件的集合。然后,您可以像以下我一样使用StreamReader来读取文件:

[HttpPost]
[Route("api/send")]
[DisableRequestSizeLimit] 
public async Task<long> CreateAsync(MyClass obj) {
{
  var file=this.Request.Form.Files[0];  //there's only one in our form
  using(StreamReader reader=new StreamReader(file))
  {
    var data=await reader.ReadToEndAsync();
    Console.WriteLine("File Content:"+data);
    Console.WriteLine("{ Field1 :"+obj.Field1.ToString()+",Field2:"+obj.Field2.ToString()+"}");
  }

}

警告
在处理multipart时要小心,因为您还需要指定段的maximum的大小。
这是在Startup中完成的:

public void ConfigureServices(IServiceCollection services) {
    services.Configure<FormOptions>(options => {
                    options.ValueCountLimit = 200;
                    options.ValueLengthLimit = int.MaxValue;
                    options.MultipartBodyLengthLimit = long.MaxValue;
                });
 }

或者像我通过使用Controller属性修饰来直接在[DisableRequestSizeLimit]-s方法中做到的那样。