在MVC5

时间:2015-09-13 20:32:10

标签: c# asp.net-mvc file-upload

我想允许我的用户使用不同的上传按钮上传不同的文档。

我的问题:我有什么方法可以获得上传的文件类型吗?

考虑一个场景: 我的用户可以通过点击继续上传按钮&来上传他们的简历。用户可以通过点击上传求职信按钮上传求职信。

我如何知道上传的内容是简历还是求职信。

我进入控制器的所有内容都是HttpPostedFileBase[]

[HttpPost]
public ActionResult Create(FormCollection collection, HttpPostedFileBase[] upload)
{
    try
    {
        // TODO: Add insert logic here

        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

我发现与我的问题类似的一个问题是:Get file names from multiple files uploaded。他们遵循的方法是否有效?我的意思是我的页面上会有8-10个上传按钮。在Post方法中有8-10个参数看起来很奇怪。

3 个答案:

答案 0 :(得分:1)

基本上,除非您想创建一个包装所有文件的ViewModel类型,否则您有三个选项。

  1. 您只能使用一个文件上传按钮multiple="multiple",并在您的操作中接受HttpPostedFileBase[](这会阻止您将文件彼此区分开来。)

  2. 您可以使用不同名称的多个文件上传按钮,并接受控制器中的多个参数(您说您不想这样做)。

  3. 您可以使用多个文件上传按钮,正确索引名称,并添加注释,以便了解哪个文件是哪个。

  4. 示例:

    HTML:

    <input type="file" name="files[0]" /> <!-- resume -->
    <input type="file" name="files[1]" /> <!-- cover letter -->
    <input type="file" name="files[2]" /> <!-- whatever else -->
    

    HttpPost

    [HttpPost]
    public ActionResult Create(HttpPostedFileBase[] files)
    {
        // files[0] == resume
        // files[1] == cover letter
        // files[2] == whatever
    }
    

    我不知道为什么你不会只为文件上传resumecoverLetter命名,然后在帖子中接受这些参数。就个人而言,我认为接受多个参数是处理此类事情的最佳方式 - 但如果您因某些原因不想这样做,这也不是一个糟糕的解决方案。

答案 1 :(得分:0)

您可以使用属性HttpPostedFileBase.ContentType

了解文件类型

答案 2 :(得分:0)

您可以将每个文件上传分解为屏幕上的单独form。然后在控制器上定位单独的操作。真的,有这么多的上传,是不是更好的只是将它们分解成单独的控制器?您可以在每个屏幕上定位多个控制器。