2017-09-11 9 views
1

FileInfoオブジェクトをパラメータとして使用するサードパーティライブラリを使用しているため、イメージをディスクに一時的に書き込む必要があるカスタムImageFilterを作成しようとしています。私はIStorageProviderを使ってファイルを簡単に書き込んで取得することができたが、IStorageFileFileInfoに変換するか、現在のテナントのメディアフォルダへのフルパスを取得してファイルを取得する方法が見つからないようだ。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フォルダ内のファイルに直接アクセスする簡単な方法はありますか?

私はマルチテナントを使用して、ので、これは不正確である場合に私を許し、これは、私は完全なストレージパスを取得し、そのからのFileInfoオブジェクトを選択するために使用する方法ではありませんよ

答えて

1

_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のものも更新する必要があり、そして事は本当に乱雑になるということです。この事実のせいで、私のプロジェクトでこの重いものをしようとすると、私はそのアプローチを中止しました。

関連する問題