2017-09-11 66 views
1

我试图创建一个自定义ImageFilter,它要求我暂时将映像写入磁盘,因为我使用的是仅以FileInfo对象为参数的第三方库。我希望我可以使用IStorageProvider轻松地写入和获取文件,但似乎无法找到将IStorageFile转换为FileInfo或获取当前租户的媒体文件夹的完整路径以自行检索文件的方法。如何从Orchard Media文件夹中获取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文件夹所以这是一个耻辱,他们不供公众查阅。我宁愿不必复制所有的初始化代码。有没有简单的方法来直接访问媒体文件夹中的文件?

回答

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的所有私有函数。但是你可能不需要所有这些。

+0

这就是我最终做的。我需要一些额外的技巧来将租户的名称添加到路径中,并且它不是很漂亮,但它至少适用于我的目的。 – Lawyerson

0

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

在查看FileSystemStorageFile的代码时可以看到这个。该类已经使用FileInfo来返回数据,但结构本身不可访问,其他代码基于此。因此,你将不得不从头开始重新实现一切(自己实现IStorageProvider)。最简单的方法是简单地调用

FileInfo fileInfo = new FileInfo(tempFilePath);

,但在没有基于文件系统的存储提供商用于像AzureBlobStorageProvider这将打破设置。

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

相关问题