2012-02-15 39 views
1

我有以下代碼可以在Internet Explorer中使用,但不能在Firefox和Google Chrome中使用。System.IO.File.Exists(fpath)在Chrome和Firefox中返回false

public ActionResult LogoForm(HttpPostedFileBase file) 
{ 
    if (file != null) 
    { 
     string fpath = file.FileName; 
     if (System.IO.File.Exists(fpath)) 
     { 
      // Logic comes here 
     } 
    } 
} 

在我看來,我有這樣的:

@using (Html.BeginForm("LogoForm", "LogoEditor", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <text>Logo Image &nbsp;&nbsp;&nbsp;</text> 
    <input type="file" name="file" id="file" /> <text> &nbsp; &nbsp; &nbsp;</text> 
    <input type="submit" name="upload" value="Upload" /> 
} 

在火狐和Chrome的任何文件的情況下,線 '如果(System.IO.File.Exists(fpath))' 總是返回假!它沒有找到該文件。爲什麼這樣?

+0

如果顯示'fpath'的值,會得到什麼結果? – CompanyDroneFromSector7G

+0

有一個file.FullName?改用它。 –

+0

嗯,我已經注意到,在IE'file.FileName'中它返回完整的文件路徑,如'C:\\ My Documents \\ ..',而在Chrome和Firefox中它只返回「Blue Hills.jpg」。有沒有其他更好的方法來檢查文件是否存在於客戶端機器上? –

回答

6

file.FileName包含客戶計算機上的文件路徑,而不是服務器上。你不應該在服務器上使用它。這在IE中工作的原因是因爲IE恰好將文件的完整路徑發送到服務器,並且因爲您在同一臺計算機上同時運行客戶端和服務器。 Chrome和FF出於安全原因決不會發送文件路徑。 IIRC他們發送一個虛擬路徑到服務器,並不存在任何地方。當您在IIS中部署應用程序並遠程訪問它時,這不適用於IE。

您不應該依賴file.FileName的路徑部分。您應該只提取文件名,然後在服務器上一些路徑串連它:

例如像

[HttpPost] 
public ActionResult LogoForm(HttpPostedFileBase file) 
{ 
    if (file != null) 
    { 
     string path = Path.GetFileName(file.FileName); 
     string fileName = Path.Combine(Server.MapPath("~/App_Data"), path); 
     if (File.Exists(fileName)) 
     { 
      // logic comes here 
     } 
    } 
} 

我也建議你檢查出following blog post關於ASP.NET MVC上傳文件。

2

當你說它在Chrome和Firefox中返回false時,它當然不是執行你的代碼的瀏覽器。這是服務器響應請求執行代碼。

想必他們會以某種不同的格式向IE提供文件名。你應該記錄什麼file.FileName,這應該讓它更清楚發生了什麼。看到瀏覽器發佈的文件名只有準確的 - 這在使用相對文件名的情況下可能與您想要的目錄無關,並且在比較絕對文件名的情況下是否存在於客戶端計算機上的文件存在於服務器上的相同位置 - 這又不是一個好主意。

編輯:這聽起來像你對該文件是否真的存在客戶端計算機感興趣。兩點:

  • 你不能告訴,並File.Exists肯定是不正確的檢查。這是運行在服務器,它無法訪問客戶端的文件系統,謝天謝地。
  • 你不應該在意。也許客戶端並不真的本地文件系統 - 也許它是從一些雲存儲模擬它,或類似的東西。你不打算這麼做:你已經收到了一些關於「文件上傳」的信息,並且這是你應該關心的。
+0

嗯,我注意到,在IE'file.FileName'中,它返回完整的文件路徑,如'C:\\ My Documents \\ ..',而在Chrome和Firefox中它只返回「Blue Hills.jpg」。有沒有其他更好的方法來檢查文件是否存在於客戶端機器上? –

+0

@卡蘭克:那麼你不應該使用'File.Exists'來開始!這是檢查*服務器*。如果他們已經提出文件上傳請求,那麼他們聲稱的文件名實際上是否存在有什麼區別? –

1

Internet Explorer發佈原始文件名,包括type =「file」輸入控件的路徑,而其他瀏覽器只提供文件名。

由於瀏覽器通常不在服務器上運行,爲什麼要檢查服務器上是否存在完整的文件名?

1

,而不是試圖用的什麼被送入控制器的路徑(如其他人所說,僅Internet Explorer的本地支持),請嘗試以下操作:

if (file != null && file.ContentLength > 0) 
{ 
    // The fielname 
    var fileName = Path.GetFileName(file.FileName); 

    // Store the file inside ~/App_Data/uploads folder for example 
    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 

    // Other stuff  
} 
+0

你的意思是別的什麼以外的'而不是使用'System.IO''看到在你的例子'路徑'存在System.IO命名空間? –

+1

謝謝安東尼,顯然有一個腦部放屁部分方式通過鍵入。 – Jesse

1

只需添加到什麼人都有已經說過,如果用戶已經將文件添加到文件輸入控件中,則它必須存在於客戶端的計算機上,因爲它們已將它添加到網站上的表單中。

一旦他們點擊了提交,HttpPostedFileBase inputstream屬性就包含了文件的字節,文件名被簡單的給出,這樣你就知道上傳文件的名字是什麼了。正如其他人建議使用Path.GetFilename(字符串)檢索只有文件名沒有目錄路徑(如提供),並將其保存到您的服務器。一般來說,我會在文件上添加某種時間戳,以免覆蓋以前的上傳文件

相關問題