tra*_*max 6 c# azure azure-storage-blobs asp.net-web-api
我正在尝试通过web-api将文件从本地命令行客户端上传到Azure存储.我正在使用Azure Web站点.与客户合作不是问题.而且我的一切工作都很好.这是web-api代码:
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);
}
Run Code Online (Sandbox Code Playgroud)
当我在本地运行时,一切正常,但是当我在Azure中部署网站时,我无法上传,因为Azure网站无法访问LocalResource.我需要切换到Azure Web-Role.我可以切换,但访问本地文件系统一直困扰着我.
MultipartFormDataStreamProvider()的实例需要LocalResource.我还没有找到将文件上传到WebApi的替代方法.我的计划是直接上传到Azure,而不在本地硬盘上存储任何内容.
有没有其他方式上传文件?
ps我看过共享访问签名的用法,我可以给客户端应用程序一个带签名的URL,让客户端直接上传到Azure Blog.但是我不确定将签名传递给客户端会有多安全,而且不太舒服.目前我认为客户端将在非常恶劣的环境中运行,并且从客户端返回任何东西都不可信任.
UPD我的最终解决方案涉及使用在服务器上发布的只写共享访问签名并传递给客户端.然后客户端将文件直接上传到Azure.这样我通过管理上传的文件节省了很多麻烦.以下是我的解决方案的更详细说明.
Dan*_*ger 12
这不是您正在寻找的答案,但您可以使用MultiPartFileStreamProvider和Path.GetTempPath()在Azure网站上使用本地存储.代码看起来像这样
public async Task<HttpResponseMessage> PostUpload()
{
var provider = new MultipartFileStreamProvider(Path.GetTempPath());
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// do the rest the same
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7086 次 |
| 最近记录: |