C# 输入流,返回到开始
我有一个控制器post方法,需要上传文件: 视图: 没有帮助C# 输入流,返回到开始,c#,validation,stream,asp.net-mvc-5,inputstream,C#,Validation,Stream,Asp.net Mvc 5,Inputstream,我有一个控制器post方法,需要上传文件: 视图: 没有帮助 在验证方法结束时,将输入流位置设置为0: HttpContext.Current.Request.Files[0]。InputStream.Position=0 没有帮助 为“reader”对象调用DiscardBufferedData reader.DiscardBufferedData(); 也没有帮助。我找到了解决办法。我将InputStream复制到另一个流(即MemoryStream),然后我可以为两个
reader.DiscardBufferedData();
也没有帮助。我找到了解决办法。我将InputStream复制到另一个流(即MemoryStream),然后我可以为两个流(InputStream和MemoryStream)设置Position=0,并且它可以工作 验证方法:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (HttpContext.Current.Request.Files == null || HttpContext.Current.Request.Files.Count == 0 || HttpContext.Current.Request.Files[0].ContentLength == 0)
results.Add(new ValidationResult("File is not selected or empty", new string[] { "NoFile" }));
using (MemoryStream ms = new MemoryStream())
{
HttpContext.Current.Request.Files[0].InputStream.CopyTo(ms);
ms.Position = 0;
using (StreamReader reader = new StreamReader(ms))
{
using (var csv = new CsvReader(reader))
{
var enumeraterecords = csv.GetRecords<TemporaryPersonCsv>();
if (enumeraterecords != null)
{
var records = enumeraterecords.ToList();
if (records == null || records.Count == 0)
results.Add(new ValidationResult("No records in file", new string[] { "NoRecords" }));
// find dublicates in CSV file
var dublicates = (records.GroupBy(p => p.Fullname.ToLower().Trim()).Where(p => p.Count() > 1).Select(p => p.Key)).ToList();
if (dublicates != null && dublicates.Count > 0)
{
foreach (var dublicateFullname in dublicates)
{
results.Add(new ValidationResult(String.Concat("There are 2 or more records with fullname='", dublicateFullname, "' in your csv file. Please, fix your file and upload again."), new string[] { "DublicateRecords" }));
}
}
// find dublicates in TemporaryPersons and Persons tables
PlugandabandonEntities db = new PlugandabandonEntities();
foreach (var record in records)
{
if (db.TemporaryPerson.Where(p => p.Fullname.ToLower() == record.Fullname.ToLower()).Count() > 0)
results.Add(new ValidationResult(String.Concat("Record with fullname='", record.Fullname, "' already exists in TemporaryPersons. Please, fix your file and upload again."), new string[] { "RecordExistsInTemporaryPerson" }));
if (db.Person.Where(p => p.Fullname.ToLower() == record.Fullname.ToLower()).Count() > 0)
results.Add(new ValidationResult(String.Concat("Record with fullname='", record.Fullname, "' already exists in Persons. Please, fix your file and upload again."), new string[] { "RecordExistsInPersons" }));
}
}
else
results.Add(new ValidationResult("No records in file", new string[] { "NoRecords" }));
}
reader.DiscardBufferedData();
}
}
HttpContext.Current.Request.Files[0].InputStream.Position = 0;
return results;
}
公共IEnumerable验证(ValidationContext ValidationContext)
{
var results=新列表();
if(HttpContext.Current.Request.Files==null | | | HttpContext.Current.Request.Files.Count==0 | | | HttpContext.Current.Request.Files[0]。ContentLength==0)
添加(新的ValidationResult(“文件未选中或为空”,新字符串[]{“NoFile”}));
使用(MemoryStream ms=new MemoryStream())
{
HttpContext.Current.Request.Files[0].InputStream.CopyTo(ms);
ms.Position=0;
使用(StreamReader=新StreamReader(ms))
{
使用(var csv=新的CsvReader(读卡器))
{
var enumeraterecords=csv.GetRecords();
if(枚举记录!=null)
{
var records=enumeraterecords.ToList();
if(records==null | | records.Count==0)
Add(新的ValidationResult(“文件中没有记录”,新字符串[]{“NoRecords”}));
//在CSV文件中查找副本
var dublicates=(records.GroupBy(p=>p.Fullname.ToLower().Trim())。其中(p=>p.Count()>1)。选择(p=>p.Key)).ToList();
if(dublicates!=null&&dublicates.Count>0)
{
foreach(变量dublicationelname,在dublicates中)
{
添加(新的ValidationResult(String.Concat(“您的csv文件中有两个或多个记录的全名为“”,DublicateName为“”),请修复文件并重新上载“”),新字符串[]{“DublicateRecords”});
}
}
//在临时人员和人员表中查找dublicates
plugandabandoneties db=新的plugandabandoneties();
foreach(记录中的var记录)
{
if(db.TemporaryPerson.Where(p=>p.Fullname.ToLower()==record.Fullname.ToLower()).Count()>0)
results.Add(新的ValidationResult(String.Concat(“Record with fullname=”,Record.fullname,”)已存在于临时人员中。请修复您的文件并重新上载。”),新字符串[]{“RecordExistsInTemporaryPerson”});
if(db.Person.Where(p=>p.Fullname.ToLower()==record.Fullname.ToLower()).Count()>0)
results.Add(新的ValidationResult(String.Concat(“Record with fullname=”,Record.fullname,“”)已存在于Persons中。请修复您的文件并重新上载。”),新字符串[]{“RecordExistsInPersons”});
}
}
其他的
Add(新的ValidationResult(“文件中没有记录”,新字符串[]{“NoRecords”}));
}
reader.discardeBufferedData();
}
}
HttpContext.Current.Request.Files[0]。InputStream.Position=0;
返回结果;
}
然后在控制器方法中有一个“virgin”InputStream,我们可以根据需要使用它;) 您真的想读取文件两次,只是为了验证其内容吗?在模型类的validate方法中有没有其他方法来验证数据?
public class UploadCsvViewModel : IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (HttpContext.Current.Request.Files == null || HttpContext.Current.Request.Files.Count == 0 || HttpContext.Current.Request.Files[0].ContentLength == 0)
results.Add(new ValidationResult("File is not selected or empty", new string[] { "NoFile" }));
using (StreamReader reader = new StreamReader(HttpContext.Current.Request.Files[0].InputStream))
{
using (var csv = new CsvReader(reader))
{
var enumeraterecords = csv.GetRecords<TemporaryPersonCsv>();
if (enumeraterecords != null)
{
var records = enumeraterecords.ToList();
if (records == null || records.Count == 0)
results.Add(new ValidationResult("No records in file", new string[] { "NoRecords" }));
// different validation, according with business logic
}
else
results.Add(new ValidationResult("No records in file", new string[] { "NoRecords" }));
}
}
return results;
}
}
var records = csv.GetRecords<TemporaryPersonCsv>().ToList();
using (MemoryStream ms = new MemoryStream())
{
HttpContext.Current.Request.Files[0].InputStream.CopyTo(ms, HttpContext.Current.Request.Files[0].ContentLength);
reader.DiscardBufferedData();
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
if (HttpContext.Current.Request.Files == null || HttpContext.Current.Request.Files.Count == 0 || HttpContext.Current.Request.Files[0].ContentLength == 0)
results.Add(new ValidationResult("File is not selected or empty", new string[] { "NoFile" }));
using (MemoryStream ms = new MemoryStream())
{
HttpContext.Current.Request.Files[0].InputStream.CopyTo(ms);
ms.Position = 0;
using (StreamReader reader = new StreamReader(ms))
{
using (var csv = new CsvReader(reader))
{
var enumeraterecords = csv.GetRecords<TemporaryPersonCsv>();
if (enumeraterecords != null)
{
var records = enumeraterecords.ToList();
if (records == null || records.Count == 0)
results.Add(new ValidationResult("No records in file", new string[] { "NoRecords" }));
// find dublicates in CSV file
var dublicates = (records.GroupBy(p => p.Fullname.ToLower().Trim()).Where(p => p.Count() > 1).Select(p => p.Key)).ToList();
if (dublicates != null && dublicates.Count > 0)
{
foreach (var dublicateFullname in dublicates)
{
results.Add(new ValidationResult(String.Concat("There are 2 or more records with fullname='", dublicateFullname, "' in your csv file. Please, fix your file and upload again."), new string[] { "DublicateRecords" }));
}
}
// find dublicates in TemporaryPersons and Persons tables
PlugandabandonEntities db = new PlugandabandonEntities();
foreach (var record in records)
{
if (db.TemporaryPerson.Where(p => p.Fullname.ToLower() == record.Fullname.ToLower()).Count() > 0)
results.Add(new ValidationResult(String.Concat("Record with fullname='", record.Fullname, "' already exists in TemporaryPersons. Please, fix your file and upload again."), new string[] { "RecordExistsInTemporaryPerson" }));
if (db.Person.Where(p => p.Fullname.ToLower() == record.Fullname.ToLower()).Count() > 0)
results.Add(new ValidationResult(String.Concat("Record with fullname='", record.Fullname, "' already exists in Persons. Please, fix your file and upload again."), new string[] { "RecordExistsInPersons" }));
}
}
else
results.Add(new ValidationResult("No records in file", new string[] { "NoRecords" }));
}
reader.DiscardBufferedData();
}
}
HttpContext.Current.Request.Files[0].InputStream.Position = 0;
return results;
}