Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 输入流,返回到开始_C#_Validation_Stream_Asp.net Mvc 5_Inputstream - Fatal编程技术网

C# 输入流,返回到开始

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),然后我可以为两个

我有一个控制器post方法,需要上传文件:

视图:

没有帮助

  • 在验证方法结束时,将输入流位置设置为0:

    HttpContext.Current.Request.Files[0]。InputStream.Position=0

  • 没有帮助

  • 为“reader”对象调用DiscardBufferedData

            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;
        }