在 C# 中流空以读取和上传 Excel 文件
Stream Empty in C# to Read and Upload Excel File
我在使用 Excel Data Reader 的 IExcelDataReader 读取 HttpPostedFileBase Excel 文件时遇到问题AWS SDK API 上传相同的 Excel 文件。进行验证以确定文件是应该上传还是仅用于数据 table,如果验证通过,将始终上传 0 Kb 的空 Excel 文件。
我试过:在使用文件的 InputStream 之前关闭并处理 IExcelDataReader;创建一个新的 Stream 并上传它;重置 InputStream 的位置;并检查此站点是否存在类似问题。此外,将上传放在验证之前会上传完整文档,但随后的 IExcelDataReader 会抛出 "can't use a disposed object" 错误。
有谁知道如何重用文件InputStream?提前致谢!
//If save to bucket area is here, upload works, but later logic fails on disposed object
IExcelDataReader uploadReader;
switch (uploadExtension)
{
case ".xls":
uploadReader = ExcelReaderFactory.CreateBinaryReader(UploadedFile.InputStream);
break;
case ".xlsx":
uploadReader = ExcelReaderFactory.CreateOpenXmlReader(UploadedFile.InputStream);
break;
default:
uploadReader = ExcelReaderFactory.CreateBinaryReader(UploadedFile.InputStream);
break;
}
DataSet excelUploadDataSet = uploadReader.AsDataSet();
var resultSheets = from DataTable sheet in excelUploadDataSet.Tables select sheet.TableName;
var excelSheets = resultSheets.ToList();
DataTable excelUpload = excelUploadDataSet.Tables[0];
int excelRows;
if ((string)excelSheets[0] != "Info")
{
//Tried everything in the problem here, to no avail
//Save to bucket area
using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1))
{
PutObjectRequest request = new PutObjectRequest
{
BucketName = bucketLocation,
Key = UploadedFile.FileName,
InputStream = UploadedFile.InputStream
};
PutObjectResponse response = client.PutObject(request);
}
}
else
{
//Other logic using data table/IExcelDataReader
}
你有从 UploadedFile.InputStream
读取的代码(因此一直寻找它到最后),然后你尝试将该流(位置设置到末尾,因此没有任何可读取的内容)传递给一些其他方法。由于 PutObject
无法从流中读取任何内容并发送空数据。
可能的修复 - 将位置设置为 0(请参阅 Stream.Seek(0, SeekOrigin.Begin) or Position = 0),但请注意,在许多情况下,流是不可搜索的(即在 ASP.Net 中上传的文件) - 在这种情况下,您需要读取流一次或将其复制到本地(即到 MemoryStream
)以读取多次。
我在使用 Excel Data Reader 的 IExcelDataReader 读取 HttpPostedFileBase Excel 文件时遇到问题AWS SDK API 上传相同的 Excel 文件。进行验证以确定文件是应该上传还是仅用于数据 table,如果验证通过,将始终上传 0 Kb 的空 Excel 文件。
我试过:在使用文件的 InputStream 之前关闭并处理 IExcelDataReader;创建一个新的 Stream 并上传它;重置 InputStream 的位置;并检查此站点是否存在类似问题。此外,将上传放在验证之前会上传完整文档,但随后的 IExcelDataReader 会抛出 "can't use a disposed object" 错误。
有谁知道如何重用文件InputStream?提前致谢!
//If save to bucket area is here, upload works, but later logic fails on disposed object
IExcelDataReader uploadReader;
switch (uploadExtension)
{
case ".xls":
uploadReader = ExcelReaderFactory.CreateBinaryReader(UploadedFile.InputStream);
break;
case ".xlsx":
uploadReader = ExcelReaderFactory.CreateOpenXmlReader(UploadedFile.InputStream);
break;
default:
uploadReader = ExcelReaderFactory.CreateBinaryReader(UploadedFile.InputStream);
break;
}
DataSet excelUploadDataSet = uploadReader.AsDataSet();
var resultSheets = from DataTable sheet in excelUploadDataSet.Tables select sheet.TableName;
var excelSheets = resultSheets.ToList();
DataTable excelUpload = excelUploadDataSet.Tables[0];
int excelRows;
if ((string)excelSheets[0] != "Info")
{
//Tried everything in the problem here, to no avail
//Save to bucket area
using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USWest1))
{
PutObjectRequest request = new PutObjectRequest
{
BucketName = bucketLocation,
Key = UploadedFile.FileName,
InputStream = UploadedFile.InputStream
};
PutObjectResponse response = client.PutObject(request);
}
}
else
{
//Other logic using data table/IExcelDataReader
}
你有从 UploadedFile.InputStream
读取的代码(因此一直寻找它到最后),然后你尝试将该流(位置设置到末尾,因此没有任何可读取的内容)传递给一些其他方法。由于 PutObject
无法从流中读取任何内容并发送空数据。
可能的修复 - 将位置设置为 0(请参阅 Stream.Seek(0, SeekOrigin.Begin) or Position = 0),但请注意,在许多情况下,流是不可搜索的(即在 ASP.Net 中上传的文件) - 在这种情况下,您需要读取流一次或将其复制到本地(即到 MemoryStream
)以读取多次。