我試圖通過web-api將文件從本地命令行客戶端上傳到Azure存儲。 我正在使用Azure Web站點。與客戶合作不成問題。我已經在本地工作得很好。這裏是網上API代碼:通過WebApi將文件上傳到Azure Blob存儲而不訪問本地文件系統
public async Task<HttpResponseMessage> PostUpload()
{
// need a local resource to store uploaded files temporarily
LocalResource localResource = null;
try
{
// Azure web-site fails here
localResource = RoleEnvironment.GetLocalResource("TempStorage");
}
catch (Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to get access to local resources");
}
var provider = new MultipartFormDataStreamProvider(localResource.RootPath);
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// snipped validation code
var container = // code to get container
foreach (var fileData in provider.FileData)
{
var filename = GetBlobName(fileData);
var blob = container.GetBlockBlobReference(filename);
using (var filestream = File.OpenRead(fileData.LocalFileName))
{
blob.UploadFromStream(filestream);
}
File.Delete(fileData.LocalFileName);
}
return Request.CreateResponse(HttpStatusCode.OK);
}
一切工作正常,當我在本地運行,但只要我在Azure中部署的網站,我不能上傳,因爲Azure的web站點不具備訪問LocalResource。我需要切換到Azure Web角色。我可以切換,但訪問本地文件系統一起困擾着我。
MultipartFormDataStreamProvider()的實例需要LocalResource。我還沒有找到其他方法將文件上傳到WebApi。我的計劃是channel through upload directly to Azure,沒有在本地硬盤上存儲任何東西。
有沒有其他的方式來上傳文件?
p.s.我已經看到了usages of Shared Access Signatures,我可以在其中向客戶端應用程序提供具有籤名的url,並讓客戶端直接上傳到Azure博客。但是我不確定這樣的安全性如何,並且在將簽名傳遞給客戶端時還不太舒服。目前我認爲客戶將會在非常惡劣的環境中運行,並且客戶不會相信任何東西。
UPD我的最終解決方案涉及使用只寫共享訪問簽名服務器上發出並傳遞到客戶端。然後客戶端將文件直接上傳到Azure。通過這種方式,我可以節省很多管理上傳文件的麻煩。這裏是我的解決方案的more detailed description。
下面的代碼拋出了什麼異常「localResource = RoleEnvironment.GetLocalResource(」TempStorage「)」 –
你很喜歡使用REST API嗎? –
@BrianDishaw異常是沿着「無法獲取LocalResource,System.Runtime.InteropServices。SEHException(0x80004005):外部組件引發異常。「此頁面(http://msdn.microsoft.com/en-us/library/windowsazure/ee758708.aspx)建議本地資源僅用於Web-和工作者角色,而不是網站 – trailmax