2016-12-26 7 views
0

私は2つのテーブル、ノートとファイル(1対多)を持っています。 "Files"フォルダにすべてのファイルを保存した後、NoteID(FK)に加えてファイルテーブルに名前、パス、拡張子を保存しました。条件に基づいてフォルダからファイルを取得mvc asp

正常にアップロードされました。 しかし、NoteID condtionsに基づいてファイルをダウンロードしたいときは、できません。 私はそのフォルダ内のすべてのファイルを取得できます。

私の質問は、特定のフォルダから条件に基づいていくつかのファイルを取得する方法ですか? 私はいくつかのソリューションを試してみましたが、うまくいきません。

助けが必要ですか?

処置:

public ActionResult Download(int NoteID) 
{ 

    var fs = db.Files.Where(f => f.NoteID == NoteID); 

    string[] files = Directory.GetFiles(Server.MapPath("/Files")); 


    for (int i = 0; i < files.Length; i++) 
    { 
     files[i] = Path.GetFileName(files[i]); 
    } 
    ViewBag.Files = files; 
    return View(); 
} 

public FileResult DownloadFile(string fileName) 
{ 
    var filepath = System.IO.Path.Combine(Server.MapPath("/Files/"), fileName); 
    return File(filepath, MimeMapping.GetMimeMapping(filepath), fileName); 
} 

ダウンロードビュー:

@{ 
    ViewBag.Title = "Download Files"; 
    var Files = (ViewBag.Files as string[]); 

    if (Files != null && Files.Any()) 
    { 
     foreach (var file in Files) 
     { 
      <br /> 
      @Html.ActionLink(file, "DownloadFile", new { fileName = file }) 
      <br /> 

     } 
    } 
    else 
    { 
     <label>No File(s) to Download</label> 
    } 
} 

編集:

上記のコードが動作し、 'ファイル' フォルダ

内のすべてのファイルを取得し、表示されます私はIOEceptionを取得するコードを実行しようとしている

アクション:

public ActionResult Download(int? NoteID) 
    { 


     var fs = db.Files.Where(f => f.NoteID == NoteID); 


     string[] files = new string[(fs.Count()) - 1]; 



     int counter = 0; 

     foreach (var item in fs) 
     { 
      files[counter] = Directory.GetFiles(Server.MapPath("/Files/"+item.FileName)).Single(); 
      /*here is the Exception 
      * 
      System.IO.IOException: 
      { "The directory name is invalid.\r\n"} 

      InnerException message: 
      The directory name is invalid.  
      */ 

     } 



     for (int i = 0; i < files.Length; i++) 
     { 
      files[i] = Path.GetFileName(files[i]); 
     } 
     ViewBag.Files = files; 
     return View(); 
    } 

    public FileResult DownloadFile(string fileName) 
    { 
     var filepath = System.IO.Path.Combine(Server.MapPath("/Files/"), fileName); 
     return File(filepath, MimeMapping.GetMimeMapping(filepath), fileName); 
    } 

ビュー:あなたの新しいコードで

@{ 
 
    ViewBag.Title = "Download Files"; 
 
    var Files = (ViewBag.Files as string[]); 
 

 
    if (Files != null && Files.Any()) 
 
    { 
 
     foreach (var file in Files) 
 
     { 
 
      <br /> 
 
      @Html.ActionLink(file, "DownloadFile", new { fileName = file }) 
 
      <br /> 
 

 
     } 
 
    } 
 
    else 
 
    { 
 
     <label>No File(s) to Download</label> 
 
    } 
 
}

+0

あなたが例外を受け取るいくつか説明をお願いできますか? – kat1330

+0

System.IO.IOException: {"ディレクトリ名が無効です。\ r \ n"} InnerExceptionメッセージ: ディレクトリ名が無効です。 – askm

+0

あなたの動作で、DownloadFile()は 'filepath'を持つ値を確認しましたか?例外があるので、ファイルを見つけるのに問題があります。右? – kat1330

答えて

2

files[counter] = Directory.GetFiles(Server.MapPath("/Files/"+item.FileName)) 

あなたは間違ったパラメータを使用しています。ファイルパスを渡していますが、このメソッドにはディレクトリパスが必要です。

あなたは、この使用することができます:

var filteredByFilename = Directory 
         .GetFiles(Server.MapPath("/Files")) 
         .Select(f => Path.GetFileName(f)) 
         .Where(f => f.StartsWith("yourFilename")); 

ViewBag.Files = filteredByFilename.ToArray(); 

をしかし、あなたの場合には、私はDirectory.EnumerateFilesメソッドを使用する方が良いと思います。 hereをお読みください。

だから、新しいコードは次のようになります。

var filteredByFilename = Directory 
         .EnumerateFiles(Server.MapPath("/Files")) 
         .Select(f => Path.GetFileName(f)) 
         .Where(f => f.StartsWith("yourFilename")); 

ViewBag.Files = filteredByFilename.ToArray(); 

全体のダウンロード方法は、次のようになります。

public ActionResult Download(int NoteID) 
{ 
    var fs = db.Files.Where(f => f.NoteID == NoteID); 

    var fileNames = Directory 
     .EnumerateFiles(Server.MapPath("/Files")) 
     .Select(f => Path.GetFileName(f)); 

    var result = new List<string>(); 

    foreach (var fileName in fs) 
    { 
     var filteredByName = fileNames.Where(f => f.StartsWith(fileName)); 
     result.AddRange(filteredByName); 
    } 

    ViewBag.Files = result.ToArray(); 
    return View(); 
} 
+0

ありがとうございますが、私の場合にはどのような方法が適していますか?私はファイルパスを渡すときにファイルを取得するメソッドは何ですか? – askm

+0

動作しますが、残念ながら1つのファイルしか取得しません。私はあなたのコードの最後の行を変更するので、どのように私は残りのファイルを追加することができます:あなたは(f => f.StartsWith(fs.Single()。FileName));私はforeachループでそれらを追加しようとしましたが、 'filteredByFilename' IEnumerable とそれは新しい項目の追加を受け付けません。どんな助け? – askm

+0

私は私の答えを編集し、私は全体の方法を追加しました。あなたはそれを試して、それが動作するか教えていただけますか? –

関連する問題