【问题标题】:Read Csv on asp.net core endpoint在 asp.net 核心端点上读取 Csv
【发布时间】:2018-02-03 05:47:41
【问题描述】:

我正在尝试创建一个接受 CSV 文件但数据流不返回任何记录的端点。

这是我的视图模型:

public class BulkUploadViewModel
{
    [Required]
    public IFormFile JobCsv { get; set; }
    [Required]
    public string UserId { get; set; }
}

这是我的终点:

[Route("BulkUpload")]
[HttpPost]
public async Task<IActionResult> BulkUpload(BulkUploadViewModel bulkUpload)
{
    if(!ModelState.IsValid)
    {
        return BadRequest();
    }

    List<BulkUploadDataModel> bulkList = new List<BulkUploadDataModel>();

    using (var memoryStream = new MemoryStream())
    {
        await bulkUpload.JobCsv.CopyToAsync(memoryStream);
        TextReader textReader = new StreamReader(memoryStream);

        var csv = new CsvReader(textReader);

        csv.Configuration.HasHeaderRecord = true;

        bulkList = csv.GetRecords<BulkUploadDataModel>().ToList();
    }

    return Ok(bulkList.Count());
}

我也尝试过逐行读取 CSV,但 Csv.Read() 返回 false。我不确定如何调试。

我正在使用邮递员生成帖子:

在调试器中,我可以看到 bulkUpload.JobCsv 中正确填充了文件名和长度值,所以我认为我的错误在于我访问流的方式。

我做错了什么?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-2.0 asp.net-core-webapi csvhelper


    【解决方案1】:

    你只是在
    await bulkUpload.JobCsv.CopyToAsync(memoryStream);之后缺少memoryStream.Position = 0

    像这样:

    await bulkUpload.JobCsv.CopyToAsync(memoryStream);
    memoryStream.Position = 0;
    TextReader textReader = new StreamReader(memoryStream);
    

    【讨论】:

      【解决方案2】:

      我有 Asp.Net 项目,我使用 Csv 包和此代码从文件中读取 csv:

      using (var stream = bulkUpload.JobCsv.OpenReadStream())
      {
          var csvLines = CsvReader.ReadFromStream(stream).ToList();
      }
      

      【讨论】:

        猜你喜欢
        • 2019-11-30
        • 2018-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-27
        • 2020-11-17
        • 1970-01-01
        • 2020-03-23
        相关资源
        最近更新 更多