如何从 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 的东西,然后事情变得非常混乱。由于这个事实,当我试图在我的项目上做这些繁重的事情时,我放弃了这种方法。
我正在尝试创建一个自定义 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 的东西,然后事情变得非常混乱。由于这个事实,当我试图在我的项目上做这些繁重的事情时,我放弃了这种方法。