我的 asp.net (c#) 网站中有一个文件上传控件,用于上传带有要插入数据库的数据的 csv 文件,我的问题是,我无法获取上传文件的实际路径
它总是给我:C:\inetput\projectfolder\csvname.csv
它应该类似于:C:\Documents and settings\Pcname\Desktop\csvname.csv
但是通过浏览文件上传的各种帖子,我开始知道需要先将文件保存在服务器上,
使用 Fileupload1.Saveas(savepath);
这是将文件保存在先前指定的位置所必需的,而这实际上并不是必需的。 (因为它会增加再次删除文件的开销)。
然后我做的是如下:
bool result = true;
strm = FileUpload1.PostedFile.InputStream;
reader2 = new System.IO.StreamReader(strm);
// **** new ****
FileInfo fileinfo = new FileInfo(FileUpload1.PostedFile.FileName);
string savePath = "c:\\"; // example "c:\\temp\\uploads\\"; could be any path
string fileName = fileinfo.Name;
string strFilePath = savePath.ToString();
savePath += fileName;
FileUpload1.SaveAs(savePath);
string strSql = "SELECT * FROM [" + fileinfo.Name + "]";
string strCSVConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strFilePath + ";" + "Extended Properties='text;HDR=NO;'";
// load the data from CSV to DataTable
OleDbDataAdapter oleda = new OleDbDataAdapter(strSql, strCSVConnString);
DataTable dtbCSV = new DataTable();
oleda.Fill(dtbCSV);
if (dtbCSV.Columns.Count != 2)
{
result = false;
}
因为我想计算文件中的列数,所以我使用的是 oledb 阅读器。
这需要一个文件来查询。
是否可以查询流?我不想保存文件,而是直接阅读而不保存。
最佳答案
不幸的是,您不能对流使用 OLEDB。
在强制使用 OLEDB 的情况下,我设法写了一个 IDisposable
将从流中提供临时文件并管理删除的包装器。
但是,您可以采用另一种方法来读取内容,而不保存它,例如直接从流中自己解析文件。我会推荐它而不是包装器,因为您可以避免文件访问限制问题以及文件访问的开销。
Here's具有多种不同方法的 SO。
关于asp.net - 有没有办法在 c# 中查询流,例如。从流对象中选择 *,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11611876/