是否可以在Umbraco中使用静态url上载媒体?

是否可以在Umbraco中使用静态url上载媒体?,umbraco,Umbraco,每当我们将媒体文件上载到我们的Umbraco CMS时,它都会在文件名中生成一个唯一的媒体id。因此,example.jpg这样的文件将获得如下url: http://content.example.com/media/947/example.jpg 如果我们更新文件,它会得到一个新的媒体id 这是令人难以置信的恼人,因为没有办法对图像进行永久链接!我们希望能够创建指向非技术人员上传的图像文件的链接,但如果url中有一个随机且可能不断变化的id,则意味着任何此类链接都有在没有警告的情况下被破坏

每当我们将媒体文件上载到我们的Umbraco CMS时,它都会在文件名中生成一个唯一的媒体id。因此,example.jpg这样的文件将获得如下url:

http://content.example.com/media/947/example.jpg
如果我们更新文件,它会得到一个新的媒体id

这是令人难以置信的恼人,因为没有办法对图像进行永久链接!我们希望能够创建指向非技术人员上传的图像文件的链接,但如果url中有一个随机且可能不断变化的id,则意味着任何此类链接都有在没有警告的情况下被破坏的危险


那么,有没有办法将媒体文件上传到Umbraco并将其放置在静态位置?

首先,我们需要思考:我们想用它做什么?如果它将在当前开发的网站内使用,并且需要可管理,我不认为当前的url约定或任何其他与媒体有关的内容会被视为拦截器/障碍的任何原因。它只需要使编辑器能够以适当的方式选择文档类型属性中的媒体,例如使用MediaPicker、MultiNodeTreePicker等。在处理和呈现过程中,我们可以轻松获取具有媒体id的文件的URL,并将其放在HTML标记中的任意位置。文学士!在我看来,这甚至更好,因为当我们删除或重新上传文件时,我们不需要更改代码、标记或逻辑中的任何其他内容,因为媒体文件的ID没有更改,我们仍然能够使用它

我不知道是否有任何CMS允许用户负责创建媒体文件URL。。。但如果是这样的话,基本上,有一种甚至不止一种方法可以实现这一点:

Hacky way-文件文档类型和模板返回数据 您可以创建包含MediaPicker属性的新文档类型。然后,使用C/Razor逻辑创建并分配模板,具体取决于您是否希望使用自定义控制器劫持路由,或者仅在模板内渲染或返回文件,并仅以所需方式返回文件数据。如果您想显示图像-您可以渲染它,如果您想播放音频或视频-您可以返回适当的对象/html5标记或其他任何内容。它可能是一个长的switch语句,涵盖所有允许的文件类型和将它们返回给用户的方法。您还可以处理该文件并在HttpResponse中返回该文件,以强制浏览器发送该文件,并强制用户将该文件下载到其磁盘。棘手的一个

Umbraco高级开发方式-自定义文件系统提供程序 我们可以创建自定义FileSystemProvider并将其分配给MediaFileSystem。它可以交换检索和寻址介质的整个介质工作流。老实说,我没有玩太多,但有一个媒体提供商的开源项目,它将媒体存储在Azure Blob上,这样我们就可以预览它是如何在那里完成的,并适应我们自己的场景

有关自定义FileSystemProvider的详细信息:

不推荐的方式-在MediaService保存事件期间复制自定义目录中的文件 在我看来,这是上面提到的最糟糕的解决方案,因为它删除了Umbraco为我们提供的管理和处理媒体文件(如ImageCropper)的所有现成功能,但是。。。我们能够连接到MediaService事件,并通过上传到我们网站的文件做任何我们想做的事情。这意味着,我们还可以复制文件,并将其放置到我们的自定义目录中,该目录需要采用和调整,以便从外部可见和使用


所以,正如你所看到的——一切都是可能的:但是,回到这篇长篇文章的要旨上来——我们需要思考我们想要用什么,以及我们是否真的需要它。我仍然找不到任何需要酷、棒、自定义媒体文件ID的用例。如果我需要它们,我会使用任何url缩写,例如bit.ly,用于露营或其他任何东西,这也会给我提供一个很好的分析工具,为我提供下载数量等数据。

我们媒体id的主要问题是无法提前知道它。因此,假设我们要求设计师将100个特定文件上传到Umbraco。每个都遵循一个命名约定,如示例{type}{kind}.jpg,其中type从1运行到25,kind从1运行到4,因此总共100个。在外部应用程序中,我们需要链接到这些文件。但是,我们不能链接到具有已知url(如/media/example_13_3.jpg)的文件,而是必须获得Umbraco生成的100个随机媒体id的列表,并永远与这些随机数字保持同步。这真是一场噩梦。我可能会在这种情况下使用FTP,而不是CMS,但它可能是一个选项,只需将这些项目分组到文件夹中,并为项目或页面映射/选择文件夹,然后在指定文件夹的内容中循环。我们需要知道全局,但总有办法@MarcinZajkowski的《黑客之路》,你从哪里知道的?是否有在线文档显示了这一点,以便开发人员可以尝试模拟该场景
在他们这边?我要看看这意味着什么。提前感谢您提供的任何信息来源。@blackhawk我还没有这样做,但我对Umbraco的经验告诉我这是可能的,而且肯定的是,这不是一个可能在文档中任何地方都会涉及到的解决方案:但它仍然是一个非常简单的解决方案。我建议用文档类型和Umbraco内容结构来伪造文件路径。每次在内容树中创建节点时,都有与之关联的URL。你们的Razor模板可以用它做任何你们能做的事情——它是C。所以你们也可以用文件返回http响应。