如何从 Orchard Media 文件夹中获取 FileInfo 对象?

How to get FileInfo objects from the Orchard Media folder?

我正在尝试创建一个自定义 ImageFilter,它需要我暂时将图像写入磁盘,因为我使用的是仅将 FileInfo 对象作为参数的第三方库。我希望我可以使用 IStorageProvider 轻松编写和获取文件,但我似乎找不到将 IStorageFile 转换为 FileInfo 或获取完整路径的方法当前租户的媒体文件夹,自己取回文件。

public class CustomFilter: IImageFilterProvider {

    public void ApplyFilter(FilterContext context)
    {
        if (context.Media.CanSeek)
        {
            context.Media.Seek(0, SeekOrigin.Begin);
        }

        // Save temporary image 
        var fileName = context.FilePath.Split(new char[] { '\' }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault();

        if (!string.IsNullOrEmpty(fileName))
        {
            var tempFilePath = string.Format("tmp/tmp_{0}", fileName);
            _storageProvider.TrySaveStream(tempFilePath, context.Media);

            IStorageFile temp = _storageProvider.GetFile(tempFilePath);
            FileInfo tempFile = ???

            // Do all kinds of things with the temporary file

            // Convert back to Stream and pass along
            context.Media = tempFile.OpenRead();
        }
    }    
}

FileSystemStorageProvider 做了很多繁重的工作来构建媒体文件夹的路径,所以很遗憾它们不能公开访问。我宁愿不必复制所有的初始化代码。有直接访问 Media 文件夹中文件的简便方法吗?

我没有使用多租户,所以如果这不准确请原谅我,但这是我用来检索完整存储路径然后从中选择 FileInfo 对象的方法:

_storagePath = HostingEnvironment.IsHosted
    ? HostingEnvironment.MapPath("~/Media/") ?? ""
    : Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Media");

files = Directory.GetFiles(_storagePath, "*", SearchOption.AllDirectories).AsEnumerable().Select(f => new FileInfo(f));

当然,您可以使用带有子文件夹名称的 Path.Combine 或 GetFiles 调用中的 Where 子句过滤文件列表。

这几乎正是 FileSystemStorageProvider 使用的,但除了弄清楚 _storagePath 应该是什么之外,我不需要它进行的其他调用。

简而言之,是的,您可能必须重新实现任务所需的 FileSystemStorageProvider 的任何私有函数。但您可能不需要所有这些。

我也在为类似的问题苦苦挣扎,我可以说 IStorageProvider 的东西非常受限。

查看FileSystemStorageFile的代码可以看到这个。 class 已经使用 FileInfo 到 return 数据,但结构本身不可访问,其他代码基于此。因此,您基本上必须从头开始重新实现所有内容(自己实现 IStorageProvider)。最简单的选择是简单地调用

FileInfo fileInfo = new FileInfo(tempFilePath);

但这会破坏没有使用基于文件系统的存储提供程序的设置,例如 AzureBlobStorageProvider

完成此任务的正确方法是亲力亲为,扩展存储提供程序接口并更新所有基于它的代码。但据我所知,这里的问题是你还需要更新 Azure 的东西,然后事情变得非常混乱。由于这个事实,当我试图在我的项目上做这些繁重的事情时,我放弃了这种方法。