1

我正在尝试创建一个需要我将图像临时写入磁盘的自定义,因为我正在使用仅将对象作为参数ImageFilter的第三方库。FileInfo我希望我可以IStorageProvider用来轻松编写和获取文件,但我似乎无法找到一种方法来转换IStorageFileFileInfo获取当前租户的 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 文件夹中的文件?

4

2 回答 2

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 的任何私有功能。但您可能不需要所有这些。

于 2017-09-11T14:03:05.910 回答
0

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

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

FileInfo fileInfo = new FileInfo(tempFilePath);

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

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

于 2017-09-11T14:49:39.693 回答