加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 通过WebApi将文件上载到Azure Blob存储,而无需访问本地文

发布时间:2020-12-15 17:47:25 所属栏目:百科 来源:网络整理
导读:我正在尝试通过web-api将文件从本地命令行客户端上传到Azure存储. 我正在使用Azure Web站点.与客户合作不是问题.而且我的一切工作都很好.这是web-api代码: public async TaskHttpResponseMessage PostUpload() { // need a local resource to store uploade
我正在尝试通过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);
    }

当我在本地运行时,一切正常,但是当我在Azure中部署网站时,我无法上传,因为Azure网站无法访问LocalResource.我需要切换到Azure Web-Role.我可以切换,但访问本地文件系统一直困扰着我.

MultipartFormDataStreamProvider()的实例需要LocalResource.我还没有找到将文件上传到WebApi的替代方法.我的计划是channel through upload directly to Azure,没有在本地硬盘上存储任何东西.

有没有其他方式上传文件?

附:我已经看过usages of Shared Access Signatures,我可以给客户端应用程序一个带签名的URL,让客户端直接上传到Azure Blog.但是我不确定将签名传递给客户端会有多安全,而且不太舒服.目前我认为客户端将在非常恶劣的环境中运行,并且从客户端返回任何东西都不可信任.

UPD我的最终解决方案涉及使用在服务器上发布的只写共享访问签名并传递给客户端.然后客户端将文件直接上传到Azure.这样我通过管理上传的文件节省了很多麻烦.这是我的解决方案的more detailed description.

解决方法

这不是您正在寻找的答案,但您可以使用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     
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读