Я использую 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 для создания объекта. Могу ли я сделать это, не загружая файл на сервер (потому что я не могу получить доступ на запись)?
Зачем вам нужно сохранять csv? Зачем создавать csv в первую очередь? Почему бы просто не создать массив байтов и загрузить его в базу данных (минуя необходимость создания этого временного csv)? – Lareau
Я никогда раньше не использовал байтовый массив. Googling сейчас. – cfly24
Вы, вероятно, можете построить свой csv, используя строковый сборщик? Не знаю, как работает csvContext. – Lareau