2014-03-04 55 views
1

如果文件正在使用指定路徑中的名稱上傳,則顯示錯誤。我想用新文件替換。我已經放置了錯誤和代碼。請幫助替換現有的圖像。HttpPostedFileBase中的文件替換MVC3

錯誤:進程無法訪問文件'',因爲它正在被另一個進程使用。

代碼:

[HttpPost] 
public ActionResult MyUpload(HttpPostedFileBase file) 
{ 
    string filePath = string.Empty; 
    string path = "C:\\"; 
    string filePath = string.Empty; 

    try 
    { 
     if (file != null && file.ContentLength > 0) 
     { 
      filePath = path + file.FileName; 

      file.SaveAs(filePath); 
      file.InputStream.Dispose(); 
      GC.Collect(); 

      // other operations, where can occur an exception 
      // (because the uploaded file can have a bad content etc.) 
     } 
    } 
    catch (Exception e) 
    { 
    } 
} 
+0

您的文件必須在其他地方打開。你是否放棄了用來操縱原始文件的任何流?另外,爲了愛上帝,除非你知道你在做什麼,否則應避免使用GC.Collect。 –

+0

您定義了'filePath'兩次...並且您應該使用'Path.Combine()'...並且您沒有爲文件指定文件名。 –

回答

0

基於你貼什麼,我建議如下:

[HttpPost] 
public ActionResult Foo(HttpPostedFileBase file) 
{ 
    var path = @"C:\"; 
    var filename = file.FileName; 

    file.SaveAs(System.IO.Path.Combine(path, filename)); 

    // do stuff here. 

    return RedirectToAction("Index"); 
} 
+1

這是工作,如果我上傳一個新的文件。如果我上傳相同的文件,它會顯示錯誤。 – user2516064

+1

好,因爲這個文件已經存在於你正在編寫它的地方。您必須先移動/刪除現有文件。 –

+0

Downvoter在事實發生一年後出現並且沒有給出解釋?尼斯。 –

0

我有這個同樣的問題。我有一個名爲「文件」的子文件夾,我使用file.SaveAs()('文件'類型爲'HttpPostedFileBase'[使用MVC])上傳文件。經過一些本地調查和在線調查後,事實證明IIS工作線程/進程正在鎖定我的文件。起初我以爲{HttpPostedFileBase}.SaveAs()是以某種方式鎖定我的文件。我甚至試圖(第一次)關閉,然後處置{HttpPostedFileBase}.InputStream,這也沒有幫助。最後,它甚至與文件上傳過程沒有任何關係。上傳文件(PDF)後,我使用ITextSharp處理它,但忘記處理對象包裝(因此它可能位於GC中)。正因爲如此,由於鎖定的現有文件導致下一個文件上傳失敗。順便說一句,我也試過file.InputStream.Dispose(); file.InputStream.Close(); GC.Collect();,但最終都將它們全部刪除,現在它仍然完美。底線,如果一個IIS工作進程鎖定你的文件,可能有一個很好的理由 - 你的代碼中的某處丟失了一些東西,而且很可能不是MVC框架或IIS本身流氓。 ;)另外,事實證明,如果它們存在,{HttpPostedFileBase}.SaveAs()將覆蓋文件,因此不需要先刪除它們。

另一個提示:我根據您的授權設置(無論您是否使用IIS進程標識或已登錄的用戶標識)來閱讀某處以注意誰在創建文件。在某些情況下,文件可能由一個登錄用戶創建,然後成爲所有者,而來自不同用戶的另一個同名文件可能會被阻止;在特殊情況下(如基於Intranet的網絡應用)可能需要記住。