2016-12-26 40 views
0

我有兩個表,Note和文件(一對多)。 我將所有文件保存在「文件」文件夾中,除了NoteID(FK)之外,我還在File表中保存了名稱,路徑,擴展名。根據條件從文件夾獲取文件mvc asp

我上傳了他們成功。 但是,當我想要基於NoteID條件下載文件時,我不能。 我可以獲取該文件夾中的所有文件。

我的問題是如何從特定文件夾中根據條件獲取一些文件? 我已經嘗試了幾種解決方案,但他們不工作。

任何幫助?

操作:

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

它的工作原理,但不幸的是它只檢索一個文件。我如何添加剩餘的文件,因爲我改變了代碼的最後一行:.Where(f => f.StartsWith(fs.Single().FileName));我試圖在foreach循環中添加它們,但'filteredByFilename'IEnumerable ,它不接受添加新項目。任何幫助? – askm

+0

我編輯了我的答案,並添加了整個方法。你可以試試看,並告訴我它是否有效? –