ExcelDataReader可以從任何流中讀取數據,而不僅僅是FileStream。您可以使用WebClient(過時),HttpClient或Azure SDK打開流並讀取blob。
讀取或下載blob會打開並讀取流。而不是例如。下載blob或將其所有內容讀取到緩衝區中,則直接訪問該流。無論您使用哪種技術,最終都會在單個網址上打開流以供閱讀。
就你而言,你可以下載並保持文件重用它,或者你可以直接從流中讀取。如果您沒有寫入磁盤文件的權限,或者如果您同時處理多個請求並且不想處理臨時文件存儲,您可能希望在Web應用程序中執行此操作。
使用HttpClient的,你可以使用GetStreamAsync方法來打開一個流:
var client=new HttpClient();
client.BaseAddress = new Uri("https://imor.blob.core.windows.net/files");
// Set headers and credentials
// ...
using(var stream=await client.GetStreamAsync("ImEx.xlsx"))
{
var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//Process the data
}
隨着Azure的SDK,您可以使用CloudBlob.OpenRead方法:
var blob = container.GetBlockBlobReference("Imex.xlsx");
using(var stream=await blob.OpenReadAsync())
{
var excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
//Process the data
}
你可能想存儲數據存儲在內存緩衝區或文件中,例如用於緩存或重新處理。爲此,您可以分別創建一個MemoryStream或FileStream,並將數據從blob流複製到目標流。
隨着HttpClient的,您可以填寫一個內存緩衝區:
//To avoid reallocations, create a buffer large enough to hold the file
using(var memStream=new MemoryStream(65536))
{
using(var stream=await client.GetStreamAsync("ImEx.xlsx"))
{
await stream.CopyToAsync(memStream);
}
memStream.Position=0;
var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memStream);
}
隨着SDK:
using(var memStream=new MemoryStream(65536))
{
//.....
var blob = container.GetBlockBlobReference("Imex.xlsx");
await stream.DownloadToStreamAsync(memStream);
memStream.Position=0;
var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memStream);
//...
}
要下載一個文件,你可以用一個FileStream替換的MemoryStream。
我建議「想要」而不是「需要」,你可以直接使用JSON和web api。我建議使用SDK,因爲它可以幫助保護代碼免受Azure存儲API中的更改 – Mick
OP正試圖使用ExcelDataReader,它可以從任何流(包括由HttpClient返回的流)讀取數據。下載對於網站,網絡應用程序或無服務器應用程序來說不是一個好主意,由於權限或可伸縮性的原因,寫入臨時文件夾不切實際 –
在我的辯護中,雖然我可能很迂腐,但他沒有提到他試圖在網絡應用上實現這一點。不過,我同意使用您提出的解決方案可能更適合。 – Chris