在C#中流空以读取和上载Excel文件

时间:2016-04-21 16:29:49

标签: c# asp.net excel filestream aws-sdk

我在使用Excel Data Reader的IExcelDataReader与AWS SDK API一起读取HttpPostedFileBase Excel文件以上载相同的Excel文件时遇到问题。验证是为了确定文件是应该上传还是仅用于数据表,如果验证通过,则总是上传一个0 Kb的空Excel文件。

我尝试过:在使用文件的InputStream之前关闭并处理IExcelDataReader;创建一个新流并上传;重置InputStream的位置;并检查此网站是否有类似的问题。此外,在验证之前放置上载完整文档,但随后的IExcelDataReader会抛出“无法使用已处置对象”错误。

有谁知道如何重用文件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
}

1 个答案:

答案 0 :(得分:3)

你有从UploadedFile.InputStream读取的代码(因此寻找它到最后)然后你尝试将该流传递(位置设置为结束,因此没有任何东西可以从中读取)到其他方法。由于PutObject无法从流中读取任何内容并发送空数据。

可能的修复 - 将位置设置为0(参见Stream.Seek(0, SeekOrigin.Begin) or Position = 0),但请注意,在许多情况下,流不可搜索(即在ASP.Net中上传文件) - 在这种情况下,您需要读取流一次或在本地复制(即到MemoryStream)以多次读取。