2014-02-08 24 views
3

我已經在ASP.NET MVC3項目中爲上傳文件編寫了一些代碼。我不是將文件存儲在數據庫中,而是將文件上傳到文件系統,並將路徑存儲在數據庫中。ASP.NET文件上傳在Windows Azure中不起作用

上傳的代碼如下: -

if (file != null && file.ContentLength > 0) 
{ 
    if (path == null) 
    { 
     throw new ArgumentNullException("path cannot be null"); 
    } 
    string pFileName = PrefixFName(file.FileName); 
    String relpath = String.Format("{0}/{1}", path, pFileName); 
    try 
    { 
     file.SaveAs(Server.MapPath(relpath)); 
     return pFileName; 
    } 
    catch (HttpException e) 
    { 
     throw new ApplicationException("Cannot save uploaded file", e); 
    } 
} 

保存文件後我已經使用圖像標記,圖像中的幾個觀點。我的代碼在本地運行良好。但是當我在windowsazure.com上託管這個網站時,所有的東西都在運行,但是文件上傳。

我該如何擺脫這種情況?請幫忙。

+0

是應用程序運行的'Website'或'雲Service'?還有你的應用程序運行多少個實例? –

+0

什麼不起作用?該文件沒有保存,你不能訪問它,它會拋出一個異常...? – Kenneth

+0

@ Gaurav Mantri,我的網站作爲網站運行,只有一個實例正在運行。僅供參考我已將所有圖像保存在「〜/ Content/Images/MyFolder」 –

回答

7

在嘗試保存文件之前需要注意的一件事是確保您想要保存文件的目錄存在。這是一段代碼片段,以確保目標服務器上已創建目標目錄。

var path= Server.MapPath("~/ImagesDirectory"); 

    if (!System.IO.Directory.Exists(path)) 
    { 
     System.IO.Directory.CreateDirectory(path); 
    } 

您可能需要包裝,這是一個try/catch,以確保您的應用程序的NTFS權限編寫,並在該位置創建目錄。另外,請確保您的path變量正在渲染出您認爲應該是的路徑。另外,如果該目錄存在於您的VS項目中,但其中沒有任何內容,那麼編譯器將不會創建該目錄。爲確保在上傳項目時創建目錄,請在該目錄中插入空文本文件(如「_doNotDelete.txt」),並將其設置爲內容的構建操作。這將確保您在發佈時創建目錄。

+1

感謝您提示有關目錄沒有被創建,如果沒有內容。 –

3

首先,您不應該在臨時操作旁邊使用Web應用程序的文件夾。由於Azure的手段多的計算機環境,資源(圖像),如果你使用一個以上的實例(機)將無法使用請求者

比方說,你上載實例A的地方,例如B的地方不會從DB獲取該文件和檢索路徑將不會更改實例B的任何內容。您永遠不會知道哪個實例將提供請求的響應。 (好吧,你可以但不在這裏範圍)但最後你必須認識到,你的上傳請求可能會去實例A和你的顯示請求可能會去實例B,它將無法檢索。

無論如何,最好的做法是直接使用blob,它們的全部用途就是這個。您可能會發現更多細節http://www.windowsazure.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs-20/

但是,如果你堅持使用本地路徑,並沒有問題丟失的文件(是的,它會發生)使用Server.MapPath("~/App_Data/...")

+1

就像一個說明一樣,這對於天藍色的網絡角色來說絕對是正確的,但不是網站。網站使用一些魔術(和天藍色的驅動器?)來允許分發的「本地」文件存儲。它本質上是一個基於blob的azure網站的存儲容器。 MS與網站的目標是使網站(custom,wordpress,joombla,DotNetNuke)的部署變得快速和簡單,而不必擔心重寫整個項目來處理blob存儲。 Azure網站上運行的所有實例均可使用此天藍色驅動器。 http://channel9.msdn.com/Events/TechEd/Europe/2012/AZR305 – Tommy

+1

謝謝@Tommy我會看。 Azure Drive是一個非常古老的概念(從開始就有這個概念),但我不知道他們有一個WebSites的新實現。將檢查。再次感謝你 – cilerler