上传pdf文件

时间:2016-07-12 02:56:32

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

我想将Pdf文件上传到我的应用程序

所以我有ViewModel(我只发布相关代码)

public class SubcategoryViewModel
{
    public HttpPostedFileBase PdfFile { get; set; }
    [DisplayName("PDF")]
    public string Pdf { get; set; }
}

控制器:

 public async Task<string> CreateSubcategory(SubcategoryViewModel model)
    {
              string pdf = null;
            if (model.Pdf != null)
            {
                pdf = Guid.NewGuid().ToString().Substring(0, 13) + "_" + model.File.FileName;
                model.Pdf = pdf;
                var path =    Path.Combine(HttpContext.Current.Server.MapPath("~/Content/pdf"), pdf);
                model.File.SaveAs(path);
            }

            var subcategory = new Subcategory
            {
                Pdf = pdf,
            };
            db.SubcategoriesList.Add(subcategory);
            await db.SaveChangesAsync();

查看:

@model Models.ViewModels.SubcategoryViewModel
@using (Html.BeginForm("Create", "Subcategory", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{
<div class="form-group">
        @Html.LabelFor(model => model.Pdf, new { @class = "control-label col-md-2" })
        <div class="col-md-10 legend-size">
            <input type="file" id="file" name="file" />
        </div>
    </div>

当我发布帖子时,我没有收到任何模型.Pdf,所以进入if (model.Pdf != null)验证它是空的,我不知道为什么

任何人都知道它为什么会发生?谢谢你提前!

2 个答案:

答案 0 :(得分:1)

您有两个主要问题。首先,文件输入的名称为name="file",但这与模型中的属性不匹配。它必须是

<input type="file" name="PdfFile" />

其次,您永远不会为属性string Pdf生成输入,因此在POST方法中,它始终为null,因此if (model.Pdf != null)中的代码将永远不会被执行。但是,你真正想要的是保存文件,如果它不是null,所以代码需要

public async Task<string> CreateSubcategory(SubcategoryViewModel model)
{
   string fileName = null;
   if (model.PdfFile != null && model.PdfFile .ContentLength > 0)
   {
       fileName = Guid.NewGuid().ToString().Substring(0, 13) + "_" + model.PdfFile.FileName;
       string path = Path.Combine(HttpContext.Current.Server.MapPath("~/Content/pdf"), fileName);
       model.PdfFile.SaveAs(path);
    }
    var subcategory = new Subcategory
    {
        Pdf = fileName ,
    };
    db.SubcategoriesList.Add(subcategory);
    await db.SaveChangesAsync();

附注:我还建议在模型中为文件显示名称(即model.PdfFile.FileName的值)添加一个附加属性,以便您可以在视图中使用该属性,而不是显示带有前缀{的名称。 {1}}对用户没什么意义。有关示例,请参阅this answer

答案 1 :(得分:0)

我认为您的问题是您在模型的PdfFile属性中获得空值。这是因为您没有给出与您属性相同的文件上传控件的name属性。将文件上传控件的name属性更改为PdfFile

<input type="file" id="file" name="PdfFile" />