2015-08-04 2 views
2

Я использую FileStream.Create для загрузки CSV-файла на сервер, а затем его считывания в базу данных SQL. Когда он будет прочитан, я просто удалю файл из папки, в которую он был записан. Цель состоит в том, чтобы просто загрузить файл в базу данных. Это будет нормально работать локально, но я не могу получить доступ на запись на новом сервере, поэтому я получаю UnauthorizedAccessException. Я не думаю, что необходимо загрузить файл на сервер, чтобы прочитать его в таблице SQL, но у меня возникают проблемы с настройкой кода.Ищет обходное решение из-за FileStream.Create UnauthorizedAccessException

[HttpPost] 
    public ActionResult UploadValidationTable(HttpPostedFileBase csvFile) 
    { 
     var inputFileDescription = new CsvFileDescription 
     { 
      SeparatorChar = ',', 
      FirstLineHasColumnNames = true 
     }; 
     var cc = new CsvContext(); 
     var filePath = uploadFile(csvFile.InputStream); 
     var model = cc.Read<Credit>(filePath, inputFileDescription); 

     try 
     { 
      var entity = new Entities(); 
      foreach (var item in model) 
      { 
       var tc = new TemporaryCsvUpload 
       { 
        Id = item.Id, 
        Amount = item.Amount, 
        Date = item.Date, 
        Number = item.Number, 
        ReasonId = item.ReasonId, 
        Notes = item.Notes 
       }; 
       entity.TemporaryCsvUploads.Add(tc); 
      } 
      entity.SaveChanges(); 

      System.IO.File.Delete(filePath); 

Вот метод uploadFile:

 private string uploadFile(Stream serverFileStream) 
    { 
     const string directory = "~/Content/CSVUploads"; 

     var directoryExists = Directory.Exists(Server.MapPath(directory)); 

     if (!directoryExists) 
     { 
      Directory.CreateDirectory(Server.MapPath(directory)); 
     } 

     var targetFolder = Server.MapPath(directory); 
     var filename = Path.Combine(targetFolder, Guid.NewGuid() + ".csv"); 

     try 
     { 
      const int length = 256; 
      var buffer = new byte[length]; 

      // write the required bytes 
      using (var fs = new FileStream(filename, FileMode.Create)) 
      { 
       int bytesRead; 
       do 
       { 
        bytesRead = serverFileStream.Read(buffer, 0, length); 
        fs.Write(buffer, 0, bytesRead); 
       } while (bytesRead == length); 
      } 

      serverFileStream.Dispose(); 
      return filename; 
     } 
     catch (Exception) 
     { 
      return string.Empty; 
     } 
    } 

Подводя итог, я загрузив CSV-файл во временную папку, читая его в объект, читая его в базу данных, а затем удаление CSV-файла из временного местоположения. Я использую Linq2Csv для создания объекта. Могу ли я сделать это, не загружая файл на сервер (потому что я не могу получить доступ на запись)?

+1

Зачем вам нужно сохранять csv? Зачем создавать csv в первую очередь? Почему бы просто не создать массив байтов и загрузить его в базу данных (минуя необходимость создания этого временного csv)? – Lareau

+0

Я никогда раньше не использовал байтовый массив. Googling сейчас. – cfly24

+0

Вы, вероятно, можете построить свой csv, используя строковый сборщик? Не знаю, как работает csvContext. – Lareau

ответ

0

Согласно http://www.codeproject.com/Articles/25133/LINQ-to-CSV-library,

вы можете прочитать из StreamReader

Read<T>(StreamReader stream) 
Read<T>(StreamReader stream, CsvFileDescription fileDescription) 

Вы, вероятно, можно использовать StreamReader (или StringBuilder), чтобы создать файл вместо CSV - Write StringBuilder to Stream

How to take a stringbuilder and convert it to a streamReader?

а затем отправить это в CSVContext?

+0

Спасибо за ваш ответ. Я смог получить эту работу, изменив только одну строку: 'var csvReader = new StreamReader (csvFile.InputStream);' – cfly24

+0

И затем вместо этого вставлять его в качестве первого параметра: 'var model = cc.Read (csvReader, inputFileDescription) ; ' – cfly24

Смежные вопросы