1

我有一個帶有圖片上傳的註冊表格,當我在我的Windows Azure服務器上傳我的軟件包應用程序時它不起作用。如何在Windows Azure平臺上傳圖片:最佳方法

在服務器中的圖像地址如下:

F:\sitesroot\0\Uploads\Users\9259826_2121813246965_1294840438_2490950_6619588_n.jpg 

如果我有這個圖片的URL這樣的,與它的相對路徑:

http://dealma.cloudapp.net/Uploads/Users/9259826_2121813246965_1294840438_2490950_6619588_n.jpg 

我已經解決了這個問題。

我使用上傳當前的代碼是這樣的:

if (userImg != null && userImg.ContentLength > 0) 
      { 
       try 
       { 
        var fileName = Url.Encode(userImg.FileName); 
        //no overwrite files 
        var pathToCheck = Server.MapPath("~/Uploads/Users/" + fileName); 
        var savePath = Server.MapPath("~/Uploads/Users/"); 
        var tempfileName = fileName; 
        int counter = 2; 

        while (System.IO.File.Exists(pathToCheck)) 
        { 
         tempfileName = counter.ToString() + fileName; 
         pathToCheck = savePath + tempfileName; 
         counter++; 
        } 

        fileName = tempfileName; 

        var finalImg = Path.Combine(savePath, fileName); 
        userImg.SaveAs(finalImg); 

        //Img name 
        userSet.Picture = finalImg; 
        userSet.Thumbnail = finalImg; 
       } 
       catch (Exception ex) 
       { 
        Response.Write("Não foi possível fazer upload do arquivo: " + ex.Message); 
       } 
      } 

有誰知道如何解決這個問題呢?

回答

1

您正試圖將映像保存到處理您的請求的Web角色所在的虛擬機。

在您的應用程序中可能存在多個Web角色實例。因此,該文件被保存在一臺機器上,但下一個請求由另一個沒有該文件的Web角色和虛擬機提供。

所以,好主意是將所有需要從任何web角色訪問的數據保存到blob。如果你有一些靜態數據,你可以將這些數據放入你的web角色中。所有其他數據應該駐留在blob中。

如果您不想修改您的應用程序的代碼,您可以將blob存儲的一部分映射爲另一個硬盤驅動器,以將其作爲您web角色的每個實例。在這種情況下,您只需將接收到的數據寫入該映射的磁盤。結果將可以從任何Web角色訪問。

+0

這是很好的建議,但我需要一個非常快速的解決方案向我的客戶展示...... –

+0

如果您有多個實例,則無法將多個實例寫入雲端硬盤,因此這不是一個可行的解決方案。直接寫入blob工作正常。 –

6

正如corvus所說的,您正在寫入「本地存儲」,它是易失性的,不會在多個虛擬機實例之間共享。

Blob存儲允許您存儲任意文件,圖像等。每個項目都存儲在自己的Blob中。您也有「容器」的概念 - 將其視爲頂級目錄文件夾。沒有嵌套的容器,但可以使用名稱中的路徑字符來模擬它們(現在請略過,因爲您需要快速解決方案)。

如果您下載Windows Azure Platform Training Kit並查看實驗室「雲服務簡介」,它會顯示一個留言簿應用程序,其中照片將上傳到BLOB存儲。您將看到如何設置存儲帳戶,以及編寫代碼將文件推送到blob而不是本地文件系統。下面是從樣本片段:

初始化的blob的客戶端,並設置容器來存儲文件:

var storageAccount = 
    CloudStorageAccount.FromConfigurationSetting("DataConnectionString"); 

// create blob container for images 
blobStorage = storageAccount.CreateCloudBlobClient(); 
CloudBlobContainer container = blobStorage.GetContainerReference("uploads"); 
container.CreateIfNotExist(); 

現在,在您的上傳處理程序,你會寫一個blob,而不是本地文件系統:

string uniqueBlobName = string.Format("uploads/image_{0}{1}", 
    Guid.NewGuid(), Path.GetExtension(UserImg.FileName)); 
CloudBlockBlob blob = blobStorage.GetBlockBlobReference(uniqueBlobName); 
blob.Properties.ContentType = UserImg.PostedFile.ContentType; 
// note: there are several blob upload methods - 
// choose the best one that fits your app 
blob.UploadFromStream(UserImg.FileContent); 

您將在下載平臺培訓套件後看到完整的工作示例。

+0

如果其他人試圖找到它,此實驗現在似乎被稱爲「雲服務簡介」。 –

相關問題