文件上传到Windows Azure Blob

时间:2014-01-06 12:14:56

标签: c# .net pdf azure knockout.js

我是Web开发的新手但是我的概念令人困惑所以我有2个问题

1->我的PDF链接网址" https://hrbcdev.blob.core.windows.net/uploads/UserForms/reportlayout-130334646861135641.pdf"之间有什么区别?和任何正常的PDF Google链接" http://www.syncfusion.com/Content/downloads/ebook/Knockoutjs_Succinctly.pdf"因为我的链接下载PDF而另一个在浏览器中打开。

2→我正在使用Windows Azure Blob将PDF文件上传到服务器,但是当我点击这些文件时,它会自动开始下载。但我想在新标签中打开而不是下载....文档上传期间是否有任何属性告诉服务器该文件是否可下载。这是我的代码:

[HttpPost]
    public virtual ActionResult UploadFile(string kind, int? entityId = null) // optionally receive values specified with Html helper
    {
        // here we can send in some extra info to be included with the delete url 
        var statuses = new List<ViewDataUploadFileResult>();
        var thumbnailKind = AppConfig.KnownKind(kind);
        var uploadLocation = AppConfig.UploadLocation(thumbnailKind);
        for (var i = 0; i < Request.Files.Count; i++)
        {
            var storage = new AzureFileStorage();

            var st = storage.StoreFile(x =>
                            {
                                x.File = Request.Files[i];
                                x.Kind = thumbnailKind;
                                //note how we are adding an additional value to be posted with delete request
                                //and giving it the same value posted with upload
                                x.DeleteUrl = Url.Action(MVC.FileUploader.DeleteFile(entityId));
                                x.StorageDirectory = uploadLocation.Path;
                                x.UrlPrefix = uploadLocation.Url;
                            });


            statuses.Add(st);
        }
        var json = new { files = statuses };
        return Request.Headers["ACCEPT"].Contains("application/json")
            ? Json(json)
            : (ActionResult)Content(json.ToJson());
    }

2 个答案:

答案 0 :(得分:2)

  

1-&gt;我的PDF链接网址之间有什么区别   “https://hrbcdev.blob.core.windows.net/uploads/UserForms/reportlayout-130334646861135641.pdf”   以及任何普通的PDF Google链接   “http://www.syncfusion.com/Content/downloads/ebook/Knockoutjs_Succinctly.pdf”   因为我的链接下载PDF而另一个打开了   浏览器。

请检查blob的content-type属性。很有可能,它会以application/octet-stream(这是blob存储中的默认内容类型)返回。由于浏览器(尤其是Chrome / Firefox)依赖此属性来决定是在浏览器中内嵌显示内容还是下载文件而未将其设置为application/pdf,因此浏览器决定下载该文件。即使在上载blob之后,您也可以以编程方式更改blob的content-type属性。

  

2→我使用Windows Azure Blob将PDF文件上传到服务器但是   当我点击这些文件时,它会自动开始下载。但   我想在新标签中打开而不是下载....有没有   文档上传期间的属性告诉服务器有关   提交是否可下载。

假设downloadable表示是否总是提示用户下载blob而不是内联显示,最近Windows Azure Storage宣布了一些更改,他们宣布的一项内容是设置{{1}的能力一个blob上的属性。对于您希望一直下载的blob,请将其Content-Disposition属性设置为Content-Disposition,然后将始终提示用户下载blob。您可以在此处详细了解新的更改:http://blogs.msdn.com/b/windowsazurestorage/archive/2013/11/27/windows-azure-storage-release-introducing-cors-json-minute-metrics-and-more.aspx

但是,如果attachment; filename=<blob file name>表示保护blob,请参阅@ramiramilu对第二个问题的回答。

答案 1 :(得分:1)

问题(1) - 将Content-Dispostion标头设置为内联时,浏览器会尝试打开文件本身。如果设置为附件,则浏览器将尝试打开弹出窗口以下载文件。在这两种情况下,文件都将下载到客户端浏览器。所以这种行为完全取决于浏览器的类型。

[编辑] 我同意Gaurav对问题(1)的看法,但是blob可能会将Content-Type作为application / pdf和Content-Disposition作为附件。

问题(2) - 您可以通过修改容器访问修饰符(如Private,public container,public blob)来限制对文件的访问。您可以将其设置为私有,以便可以直接访问该容器的内容。根据Microsoft - “默认情况下,容器是私有的,只能由帐户所有者访问。要允许对容器中的Blob进行公共读取访问,而不是容器属性和元数据,请使用”Public Blob“ “选项。要允许容器和blob的完全公共读取访问权限,请使用”公共容器“选项。

您还可以使用SAS保护您的blob - http://www.dotnetcurry.com/showarticle.aspx?ID=901