由于 FileStream.Create UnauthorizedAccessException 正在寻找解决方法
Looking for workaround due to FileStream.Create UnauthorizedAccessException
我正在使用 FileStream.Create
将 .csv 文件上传到服务器,然后将其读入 SQL 数据库。读入后,我只需从写入文件的文件夹中删除文件。目标是将文件放入数据库。这在本地 运行 很好,但我无法在新服务器上获得写入权限,所以我得到了 UnauthorizedAccessException
。我认为没有必要将文件上传到服务器以将其读入 SQL table,但我在调整代码时遇到了问题。
[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);
上传文件方法如下:
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 创建对象。我可以在不将文件上传到服务器的情况下执行此操作吗(因为我无法获得写入权限)?
根据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?
我正在使用 FileStream.Create
将 .csv 文件上传到服务器,然后将其读入 SQL 数据库。读入后,我只需从写入文件的文件夹中删除文件。目标是将文件放入数据库。这在本地 运行 很好,但我无法在新服务器上获得写入权限,所以我得到了 UnauthorizedAccessException
。我认为没有必要将文件上传到服务器以将其读入 SQL table,但我在调整代码时遇到了问题。
[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);
上传文件方法如下:
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 创建对象。我可以在不将文件上传到服务器的情况下执行此操作吗(因为我无法获得写入权限)?
根据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?