6

MVC 5では、これを行っていました:

var context = (HttpContextBase)Request.Properties["MS_HttpContext"];
var file = (HttpPostedFileBase)context.Request.Files[0];

現在、これらは vNext の下の MVC 6 では使用できません。リクエストからファイルを取得するにはどうすればよいですか?

4

4 に答える 4

8

以下の回答はbeta6版についてです。

現在は枠組みの中にあります。これまでのところ、いくつかの注意点がありますが、アップロードされたファイル名を取得するには、ヘッダーを解析する必要があります。また、コントローラーに IHostingEnvironment を挿入して、wwwroot フォルダーの場所にアクセスする必要があります。

これを例にとります:

public class SomeController : Controller
{

    private readonly IHostingEnvironment _environment;

    public SomeController(IHostingEnvironment environment)
    {       
        _environment = environment;
    }

    [HttpPost]
    public ActionResult UploadFile(IFormFile file)//, int Id, string Title)
    {

        if (file.Length > 0)
        {
            var targetDirectory = Path.Combine(_environment.WebRootPath, string.Format("Content\\Uploaded\\"));
            var fileName = GetFileName(file);
            var savePath = Path.Combine(targetDirectory, fileName);

            file.SaveAs(savePath);
            return Json(new { Status = "Ok" });
        }
        return Json(new { Status = "Error" });
    }

    private static string GetFileName(IFormFile file) => file.ContentDisposition.Split(';')
                                                                .Select(x => x.Trim())
                                                                .Where(x => x.StartsWith("filename="))
                                                                .Select(x => x.Substring(9).Trim('"'))
                                                                .First();

}
于 2015-08-17T07:33:55.940 に答える
6

FileUpload は MVC6 にはまだ実装されていません。ステータスについては、この問題と、この問題などの関連する問題を参照してください

JavaScript からXMLHttpRequestを投稿し、次のコードのようなものでキャッチできます。

public async Task<IActionResult> UploadFile()
{
    Stream bodyStream = Context.Request.Body;

    using(FileStream fileStream = File.Create(string.Format(@"C:\{0}", fileName)))
    {

        await bodyStream.CopyToAsync(fileStream);

    }

  return new HttpStatusCodeResult(200);
}

編集: 問題がリンクされている場合、それらの問題はクローズされています。MVC6 では、より通常の方法でファイルをアップロードできるようになりました。

于 2014-10-18T23:00:35.250 に答える
6

ファイル アップロード バインダーが実装されました。コミットを参照してください:

https://github.com/aspnet/Mvc/commit/437eb93bdec0d9238d672711ebd7bd3097b6537d#diff-be9198f9b55d07e00edc73349c34536aR118

于 2015-01-16T08:40:09.713 に答える
3

ASP.NET Core 1.0 (MVC 6)
ビュー (cshtml) でファイルをアップロードする最も簡単な方法:

<form method="post" asp-action="Upload" asp-controller="Home" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="upload"/>
</form>

コントローラー (cs) :

[HttpPost]
public IActionResult Upload(IFormFile file)
{
    if (file == null || file.Length == 0)
        throw new Exception("file should not be null");

    // RC1
    // var originalFileName = ContentDispositionHeaderValue.Parse(file.ContentDisposition).FileName.Trim('"');    
    // file.SaveAs("your_file_full_address");

   // RC2
   using (var fileStream = new FileStream("path_address", FileMode.Create))
   {
       await file.CopyTo(fileStream);
   }
}
于 2016-06-19T06:28:22.977 に答える