gpt4 book ai didi

asp.net-core - 为什么 CsvHelper 不从 MemoryStream 读取?

转载 作者:行者123 更新时间:2023-12-04 07:16:11 24 4
gpt4 key购买 nike

我正在尝试将上传的 csv 文件转换为对象,以便我可以保存在 db 中。
在 Controller 中我使用 CsvHeler

但看起来这只有在我首先保存文件并从中读取时才有效。 CsvHelper 无法直接从内存流处理文件内容。在下面的代码中,第一个 GetRecords 返回空

    [HttpPost]
[Route(ApiRoutes.EodVariationMarginPlugs)]
public async Task<IActionResult> UploadPlugAsync(IFormFile filePayload)
{

if (filePayload.Length > 0)
{

using (var stream = new MemoryStream())
{
filePayload.CopyTo(stream);
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader))
{
csv.Configuration.RegisterClassMap<EodVariationMarginPlugMap>();
csv.Configuration.MissingFieldFound = null;
var records = csv.GetRecords<EodVariationMarginPlug>().ToList(); // record count is 0
foreach (var p in records)
{
p.CreatedAt = DateTimeOffset.Now;
p.CreatedBy = HttpContext.User.Identity.Name;
}
await _repository.InsertPlugsAsync(records);
}
}

var fileName = ContentDispositionHeaderValue
.Parse(filePayload.ContentDisposition)
.FileName.ToString().Trim('"');
var path = Path.Combine(Path.GetTempPath(), fileName);
using (var fileStream = new FileStream(path, FileMode.Create))
{
await filePayload.CopyToAsync(fileStream);
}
var textReader = System.IO.File.OpenText(path);
using (var csv = new CsvReader(textReader))
{
csv.Configuration.RegisterClassMap<EodVariationMarginPlugMap>();
csv.Configuration.MissingFieldFound = null;
var records = csv.GetRecords<EodVariationMarginPlug>().ToList();
foreach (var p in records)
{
p.CreatedAt = DateTimeOffset.Now;
p.CreatedBy = HttpContext.User.Identity.Name;
}
await _repository.InsertPlugsAsync(records);
}
}
return Ok();
}

最佳答案

这里最常见的错误是忘记 MemoryStream是二进制的;它以字节为单位。你需要一些处理字符的东西。好消息是您通过包装 MemoryStream 避免了该错误。在 StreamReader :

using (var reader = new StreamReader(stream))
StreamReader工具 TextReader ,它适用于字符而不是字节。好极了!坏消息是 StreamReader 是在这一行之后创建的:
filePayload.CopyTo(stream);
问题是那条线离开了流指向 结束 的数据。当您尝试从中读取时,流中没有任何内容。
解决此问题所需要做的就是从头开始。所以这:
using (var stream = new MemoryStream())
{
filePayload.CopyTo(stream);
using (var reader = new StreamReader(stream))
变成这样:
using (var stream = new MemoryStream())
{
filePayload.CopyTo(stream);
stream.Seek(0, SeekOrigin.Begin);

using (var reader = new StreamReader(stream))

关于asp.net-core - 为什么 CsvHelper 不从 MemoryStream 读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49434920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com