【问题标题】:Why is my csv file path always returning null?为什么我的 csv 文件路径总是返回 null?
【发布时间】:2014-10-03 08:43:40
【问题描述】:

我目前正在开发一个 ASP.NET MVC 项目,用户可以在该项目中将 csv 和 excel 记录插入数据库中,然后进行编辑。我已经完成了excel部分,它工作得很好。但另一方面,我的 csv 版本甚至无法采用 csv 文件路径,它总是返回 null。我尝试了不同的方法,但似乎都不起作用。

我希望保持 excel 版本和 csv 版本相似,因此我在两者上都使用了 httpPost,但由于某种原因,它无法获取 csv 文件路径。 有人可以看到我做错了什么吗?

这是我应该发送文件路径的主控制器视图:

@{
    ViewBag.Title = "Index";
}

<h1>Index</h1>

@using (Html.BeginForm("Import", "CSVImport", FormMethod.Post, new {enctype="multipart/form-data" }))
{
    @Html.ValidationSummary(true)
    <fieldset>
        Select a file <input type="file" name="file" />
        <input type="submit" value="Upload CSV" />
    </fieldset>
}

这是我的 csv 导入器:

using System.Data.Common;
using System.Text;
using System.Data.ProviderBase;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Data.Sql;
using Microsoft.VisualBasic.FileIO;

namespace BFProj2.Controllers
{
    public class CSVImportController : Controller
    {

        // GET: CSVImport
        //public static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        [HttpPost]
        public ActionResult Import(HttpPostedFileBase csv_file_path)
        {
             DataTable csvData = new DataTable();
             if (csv_file_path != null && Request.Files["csv_file_path"].ContentLength > 0)
             {
             try
            {
                using (TextFieldParser csvReader = new TextFieldParser(csv_file_path.InputStream))
                {

                    //Solution to HDR problem: When getting to the checkbox part of the application, just keep the HDR unchecked.
                    csvReader.SetDelimiters(new string[] { "," });
                    //Can be true depending on if the csv document rows are enclosed in quotes or not. Delimiters are set as either ; or , depending on weather the csv columns are split with ; or , 
                    csvReader.HasFieldsEnclosedInQuotes = false;
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn Titel = new DataColumn(column);
                        Titel.AllowDBNull = true;
                        csvData.Columns.Add(Titel);

                        DataColumn LastName = new DataColumn(column);
                        LastName.AllowDBNull = true;
                        csvData.Columns.Add(LastName);

                        DataColumn AbstrNum = new DataColumn(column);
                        AbstrNum.AllowDBNull = true;
                        csvData.Columns.Add(AbstrNum);

                        DataColumn PosterTitel = new DataColumn(column);
                        PosterTitel.AllowDBNull = true;
                        csvData.Columns.Add(PosterTitel);

                        DataColumn Workshop = new DataColumn(column);
                        Workshop.AllowDBNull = true;
                        csvData.Columns.Add(Workshop);

                        DataColumn Keywords = new DataColumn(column);
                        Keywords.AllowDBNull = true;
                        csvData.Columns.Add(Keywords);

                        DataColumn Institution = new DataColumn(column);
                        Institution.AllowDBNull = true;
                        csvData.Columns.Add(Institution);

                        DataColumn CollabEmail = new DataColumn(column);
                        CollabEmail.AllowDBNull = true;
                        csvData.Columns.Add(CollabEmail);

                    }
                    while (!csvReader.EndOfData)
                    {
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }
                        csvData.Rows.Add(fieldData);

                    }
                    csvData = System.Data.Common.DbProviderFactories.GetFactoryClasses();

            ViewData.Model = csvData.AsEnumerable();
                }
            }
             catch (Exception ex)
             {

             }
             }

            return View();

        }
        }
    }

我从中获取了一些原始资料: http://www.morgantechspace.com/2013/10/import-csv-file-into-sql-server-using.html

我还没有放入批量复制部分,它只是一个 DataTable,但我想使它在控制器中完成所有操作,然后再次返回主控制器视图,而不是将其放置在其他地方。

顺便说一句,我对 stackoverflow 还是很陌生,所以如果我做错了与提问相关的问题,我需要指导来更改它。

【问题讨论】:

  • 欢迎来到 SO。我可能读错了,但您的 &lt;input type="file"&gt; 是否应该命名为 csv_file_path 而不是 file
  • 啊,谢谢。你是对的,可能有点代码盲,所以如果我将 csv_file_path 更改为 file 它会识别文件路径?
  • 它没有用。文件路径仍然返回 null。
  • 您是否也更改了Request.Files["file"]? (你也应该能够只做file.ContentLength - HttpPostedFileBase 包含你需要的一切)
  • 现在成功了,谢谢!错过了 request.Files 中的那个。

标签: c# asp.net-mvc csv filepath


【解决方案1】:

当你发布一个文件时,&lt;input&gt; 的名称被用作Request.Files 的键和操作方法的参数名称,所以这些需要匹配。在您的情况下,您有&lt;input name="file"&gt;,但参数名称为csv_file_path。所以你需要重命名一个或另一个:

<input name="file">

public ActionResult Import(HttpPostedFileBase file)
{
    if (file != null && Request.Files["file"].ContentLength > 0)
    ...
}

<input name="csv_file_path">

public ActionResult Import(HttpPostedFileBase csv_file_path)
{
    if (csv_file_path != null && Request.Files["csv_file_path"].ContentLength > 0)
    ...
}

注意你也不需要使用Request.Files - HttpPostedFileBase 有你需要的:

    if (csv_file_path != null && csv_file_path.ContentLength > 0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-09-12
    • 2019-09-18
    • 2014-09-02
    • 2015-02-27
    • 2021-01-10
    相关资源
    最近更新 更多