【问题标题】:What folder in asp MVC Web Sites are accessible to store and retrieve files apart from App_Data when hosted in Azure Web Sites?当托管在 Azure 网站中时,除了 App_Data 之外,asp MVC 网站中的哪些文件夹可用于存储和检索文件?
【发布时间】:2014-07-03 02:53:19
【问题描述】:

我刚刚完成了我的 asp MVC 5 网站,该网站具有上传、显示和下载文件的能力。离线时,我将文件上传到根目录内的随机文件夹,如 ~/assest/images 等,效果很好。

然后我部署到windows Azure网站服务,开始意识到根目录已经无法访问了。我开始做研究,发现只有 App_Data 可以存储文件。唉,这不是一个好的解决方案,我们无法检索要在剃刀视图中显示的文件(如图像)。

我也找到了BLOB Storage,看起来不错,但是没有足够的教程,我无法成功使用。其中大部分是针对 MVC Web 角色的,而在我的情况下是 MVC WEB SITES。

现在,我想找到另一种选择,是否有任何特殊文件夹或解决方法可以将一个折叠在根目录中以存储文件并检索它们?事实上,我的应用程序只需要存储几张图片和 PDF。

谢谢

【问题讨论】:

    标签: asp.net-mvc azure azure-web-app-service blobstorage


    【解决方案1】:

    您不应该使用 App_Data 来存储使用 Azure 网站上传的文件。您只能获得有限的空间,如果您将站点扩展到更多实例,则上传的文件将仅在上传文件的实例上可用!

    处理上传文件的正确方法确实是使用 Blob 存储。您可以从您的网站轻松使用它。只需安装 Azure .NET 存储客户端库(这是available from Nuget)。

    http://azure.microsoft.com/en-us/documentation/articles/storage-dotnet-how-to-use-blobs/ 上提供了有关使用 Azure .NET 存储客户端库的完整教程

    您可以通过公开 Blob 容器轻松地在您的网站上显示上传的图片。然后,您可以直接链接到您的 blob 容器中的图像 - 它的 URL 类似于

    https:// 您的存储帐户名称 .blob.core.windows.net/ 您的 blob 容器名称 /filename.jpg

    【讨论】:

    • 谢谢您,先生!现在我比以往任何时候都更有信心继续使用 blob 存储:D
    • 这部分不正确:“上传的文件将仅在上传它们的实例上可用!”。当您将文件上传到 Azure 网站中的文件夹时,它们立即可供所有实例使用(除非您将它们放在 %TEMP% 文件夹中)。除此之外,我同意你的看法
    • 等一下,我才意识到“上传的文件只在上传的实例上可用!”这句话。暗示我们确实可以将文件上传到本地文件夹?如果是这样的话,你能把方法分享给我吗? @alexwarren 谢谢
    【解决方案2】:

    如果您不希望需要太多存储空间,您可以将文件存储在站点文件夹中的任何位置。如果您将文件上传到 APP_DATA 以外的任何地方,我不确定为什么会看到错误,您应该在任何地方都具有完全的写入权限。

    与其他人的 cmets 不同,如果您将文件存储在站点的本地存储中,那么您的文件可以安全地防止虚拟机出现故障,并且可以立即用于所有其他实例。这是因为文件实际上并没有存储在本地 VM 上,这只是一种错觉。 (唯一的例外是,如果您将内容存储在 %TEMP% 文件夹中。这些内容实际上保存在 VM 上,并且随时可能消失)。

    也就是说,如果您期望大量数据 I/O 或需要大量存储,那么 Blob 存储是最好的选择。

    【讨论】:

    • 先生,这实际上让我感到惊讶,我以为我将拥有完全的写入权限,但事实证明并非如此。是只是限制权限的天蓝色还是我不知道。或者文件夹是否有任何设置可写?还是我必须使用相对/绝对路径。我想我一直在研究所有的可能性,变得如此绝望,以至于我在这里寻求任何启示。让我详细说明一下:我在部署时拥有完全访问权限,我可以使用像 ~/assets/images 这样的任意文件夹,但他们不允许我在部署后在上面写任何东西。
    • 顺便说一句,如果你有在本地文件夹中存储文件的知识,如果你能分享它,我会很高兴。了解这两种方式将是有益的;存储在本地文件夹和 blob 存储中。谢谢
    • 我在这篇文章中找到了您的评论:stackoverflow.com/questions/11016098/… 但我仍然无法完全了解如何使其工作
    • @AceSupriatna 如果不写入相对文件夹路径,而是尝试写入 C:\DWASFiles\Sites[siteName]\VirtualDirectory0\site\wwwroot 的绝对路径,会发生什么情况?那它行得通吗?我从来不需要做任何特别的事情来将文件存储在我想要的任何地方。唯一的限制是您不能将文件直接放在 VirtualDirectory0 文件夹下,但您可以在该文件夹下创建您想要的所有子文件夹
    • 我只是随机玩了我们现在正在谈论的 azure 网站,令人惊讶的是,我这次可以将图像上传到本地文件夹。尽管如此,当我尝试在另一个控制器中上传另一个图像时,它会给出如下错误: System.IO.DirectoryNotFoundException: 找不到路径的一部分 'D:\home\site\wwwroot\assets\images\pages\ product\Produk Baru.JPG' 您认为可能是什么问题?
    【解决方案3】:

    我不希望为 Azure 网站或 Web 服务构建依赖本地存储的解决方案。您无法扩展此解决方案,并且 VM 可能会重新映像等。

    我会查看 blob 存储,我将上传限制在 4mb 以下,因为我在将它们写入 blob 存储之前在服务器上对其进行验证,但我相信您可以将其直接流式传输到存储中。

    这里有一个Guide to uploading large files from MVC,可以帮助您入门。

    【讨论】:

    • 非常感谢,你帮助了我。我会努力让这个 blob 事情顺利进行。
    • VM 宕机不会影响保存在本地存储上的文件。 “本地存储”只是一种抽象,文件实际上安全地保存在其他地方。这就是您的所有实例可以访问相同文件的方式
    • 本地存储被 Microsoft 描述为“每实例临时存储”。 social.technet.microsoft.com/wiki/contents/articles/… 除非我第一次尝试后发生了变化?
    猜你喜欢
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多