Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Orchardcms 如何从Orchard媒体文件夹获取FileInfo对象?_Orchardcms_Orchardcms 1.10 - Fatal编程技术网

Orchardcms 如何从Orchard媒体文件夹获取FileInfo对象?

Orchardcms 如何从Orchard媒体文件夹获取FileInfo对象?,orchardcms,orchardcms-1.10,Orchardcms,Orchardcms 1.10,我正在尝试创建一个自定义的ImageFilter,它需要我将映像临时写入磁盘,因为我使用的是一个第三方库,它只将FileInfo对象作为参数。我希望我可以使用IStorageProvider轻松编写和获取文件,但我似乎找不到方法将IStorageFile转换为FileInfo,或者获取当前租户的媒体文件夹的完整路径来检索文件 公共类CustomFilter:IImageFilterProvider{ public void ApplyFilter(FilterContext上下文) { if(c

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

公共类CustomFilter:IImageFilterProvider{
public void ApplyFilter(FilterContext上下文)
{
if(context.Media.CanSeek)
{
context.Media.Seek(0,SeekOrigin.Begin);
}
//保存临时映像
var fileName=context.FilePath.Split(新字符[]{\\},StringSplitOptions.RemoveEmptyEntries.LastOrDefault();
如果(!string.IsNullOrEmpty(文件名))
{
var tempFilePath=string.Format(“tmp/tmp_{0}”,文件名);
_storageProvider.TrySaveStream(tempFilePath,context.Media);
IStorageFile temp=\u storageProvider.GetFile(tempFilePath);
FileInfo tempFile=???
//使用临时文件执行各种操作
//转换回溪流,继续前进
context.Media=tempFile.OpenRead();
}
}    
}

FileSystemStorageProvider
在构建媒体文件夹的路径方面做了大量的工作,因此它们无法公开访问,这是一件很遗憾的事情。我不希望复制所有的初始化代码。有没有一种简单的方法可以直接访问媒体文件夹中的文件?

我没有使用multitenancy,请原谅我的说法不准确,但这是我用来检索完整存储路径,然后从中选择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.combined子文件夹名称或GetFiles调用上的Where子句来筛选文件列表

这正是FileSystemStorageProvider所使用的,但我不需要它在弄清楚storagePath应该是什么之外进行其他调用


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

我也遇到了类似的问题,我可以说,
IStorageProvider
的内容受到了很大的限制

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

FileInfo FileInfo=newfileinfo(tempFilePath)

但这将打破没有使用基于文件系统的存储提供程序(如
AzureBlobStorageProvider
)的设置


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

这就是我最终要做的。我需要一些额外的技巧来将租户的名字添加到路径中,这并不漂亮,但至少对我来说是有效的。