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

时间:2017-09-11 13:16:34

标签: orchardcms orchardcms-1.10

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

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文件夹的路径做了大量工作,所以很遗憾他们无法公开访问。我宁愿不必复制所有初始化代码。有没有一种简单的方法可以直接访问Media文件夹中的文件?

2 个答案:

答案 0 :(得分:1)

我没有使用多租户,所以请原谅我这是不准确的,但这是我用来检索完整存储路径然后从中选择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的任何私有功能。但你可能不需要所有这些。

答案 1 :(得分:0)

我也在努力解决类似的问题,我可以说IStorageProvider的内容非常受限制。

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

FileInfo fileInfo = new FileInfo(tempFilePath);

但是这会破坏没有像AzureBlobStorageProvider那样使用基于文件系统的存储提供程序的设置。

此任务的正确方法是弄脏并扩展存储提供程序接口并更新基于它的所有代码。但据我记忆,这里的问题是你需要更新Azure的东西,然后事情变得非常混乱。由于这个事实,我试图在我的项目中做这么重的事情时中止了这种方法。