web-dev-qa-db-ja.com

asp.netコアWeb APIでのマルチパート/フォームデータファイルのアップロード

Asp.netコアWeb APIでMultipart-form-dataファイルをアップロードするにはどうすればよいですか?単一のPOSTでJSONと画像の両方をPOST同時に実行できますか?

9
Satyajit

アップデート-.net core 2.0 +

。net coreを使用すると、新しいIFormFileインターフェイスを活用して、同じ投稿に画像とプロパティの両方をアップロードできます。例えば:

[HttpPost("content/upload-image")]
public async Task<IActionResult> UploadImage(MyFile upload)

MyFileクラスは次のようになります。

public class MyFile
{
    public string userId { get; set; }        
    public IFormFile File { get; set; }
    // Other properties
}

propertiesおよびfileにアクセスするには、次のようにします。

var file = upload.File // This is the IFormFile file
var param = upload.userId // param

ファイルをディスクに永続化/保存するには、次の操作を実行できます。

using (var stream = new FileStream(path, FileMode.Create))
{
    await file.File.CopyToAsync(stream);
}

。NET Framework

はい、そうです。クライアントに応じてFramework使用している場合、Web APIContent Type-Multipartに設定してから、次のように実行できます。

[HttpPost]
[Route("content/upload-image")]       
public async Task<HttpResponseMessage> Post()
{
    if (!Request.Content.IsMimeMultipartContent())
    {
        throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
    }           
    // enter code here
}

イメージを保存するディレクトリを定義および設定します。

var root = HttpContext.Current.Server.MapPath("~/Content/Images/");
if (!Directory.Exists(root))
{
    Directory.CreateDirectory(root);
}  

StreamProviderをセットアップし、modelデータの取得を試みます。これは[〜#〜] json [〜#〜]でした。

var streamProvider = new MultipartFormDataStreamProvider(root);
var result =
    await Request.Content.ReadAsMultipartAsync(streamProvider);
if (result.FormData["model"] == null)
{
    throw new HttpResponseException(HttpStatusCode.BadRequest);
}

リクエスト内のファイルにアクセスします。

try
{
    // Deserialize model data to your own DTO
    var model = result.FormData["model"];
    var formDto = JsonConvert
        .DeserializeObject<MyDto>(model, new IsoDateTimeConverter());
    var files = result.FileData.ToList();                
    if (files != null)
    {
        foreach (var file in files)
        {
            // Do anything with the file(s)
        }
    }
}
13
Felix Too