2013-07-24 57 views
2

我想獲取上傳文件的文件路徑,並且我使用HttpPostedFile,但似乎並沒有獲取路徑名稱的選項。真的嗎? 我該如何解決這個問題?從HttpPostedFile獲取文件路徑

foreach (string s in Request.Files) 
      { 
       HttpPostedFile file = Request.Files[s]; 
       string fileName = file.FileName; 
       string filePath = Path.GetFullPath(fileName); 
       string fileExtension = ""; 

       if (!string.IsNullOrEmpty(fileName)) 
        fileExtension = Path.GetExtension(fileName); 

       .... 
      } 
+1

'file.FileName'給你什麼? –

+0

@AlaaMasoud我想保存正在上傳的文件路徑的副本。是否有可能將上傳更改爲使用fileStream,這樣就有可能? – Masriyah

+0

@DimitarDimitrov'file.FileName'給了我'docName.doc',但是我想'c:\ temp \ files \ docName.doc' – Masriyah

回答

2

正如PKKG在評論中指出的,由於瀏覽器的安全限制,這是不可能的。 他們只會告訴你上傳文件的名稱,而不是它的路徑。

另外,例如,Google Chrome會在嘗試通過javascript抓取它時給您一個僞造的路徑:C:\fakepath\TestFile.xml

編輯: 現在,我有IE在眼前,我甚至意識到這給你完全正確的路徑通過javascript如果你搶選定值,例如通過document.forms.file.value

這是IMO不應該依賴的不良行爲。瀏覽器應該隱藏這些有把握的數據,你可能最好不要試圖破解一段可能會有效的解決方案,但它在不同的瀏覽器甚至不同版本中並不安全。 也許更好的問題是,無論如何,你想用客戶的完整路徑做什麼?可能還有另一種方法,不需要客戶的路徑。

+0

是否可以處理上傳文件的不同方式,以便我可以獲取路徑?的FileStream? – Masriyah

+0

@ loop852請參閱我的編輯。底線是:某些瀏覽器版本可能會有一些解決方法。但是,由於瀏覽器不應該告訴你客戶的路徑,你不應該試圖「打敗」瀏覽器的安全限制,因爲這可能只是爲未來版本打破你的代碼。 –

+0

我正在使用這個作業提交,所以當一個學生上傳他們的硬盤時,我正在保存他們上傳文件的路徑。基本上只用於數據庫,不能以任何方式訪問它更像是證明,如果文件出現任何問題。 – Masriyah

1

我使用這個,是很完美:

public ActionResult SaveAvatar(IEnumerable<HttpPostedFileBase> files) 
{ 
    if (files != null) 
    { 
     foreach (var file in files) 
     { 
      var FileName = Path.GetFileName(file.FileName); 
      string extension = Path.GetExtension(FileName).ToUpper(); 
      // do save operation 
     } 
    } 

    // Return an empty string to signify success 
    return Content(""); 
} 

注:當考慮安全風險上傳。