2010-11-19 6 views
0

Meine Asp.net MVC App erfordert einen Dateiupload. Im Verlauf des Uploads möchte ich die frisch hochgeladene Datei manipulieren.Manipulation der hochgeladenen Datei verursacht IOException

public ActionResult Edit(int id, FormCollection collection) { 
    Block block = userrep.GetBlock(id); 
    foreach (string tag in Request.Files) { 
     var file = Request.Files[tag] as HttpPostedFileBase; 

     if (file.ContentLength == 0) 
      continue; 

     string tempfile = Path.GetTempFileName() 
     file.SaveAs(tempfile); 
     // This doesn't seem to make any difference!! 
     // file.InputStream.Close(); 

     if (FileIsSmallEnough(file)) { 
      // Will throw an exception!! 
      File.Move(tempfile, permanentfile); 
     } else { 
      GenerateResizedFile(tempfile, permanentfile); 
      // Will throw an exception!! 
      File.Delete(tempfile); 
     } 

     block.Image = permanentfile; 
    } 
    userrep.Save(); 

Das Problem mit diesem Code-Schnipsel ist, dass jeder Versuch, die ursprünglich hochgeladene Datei erzeugt eine IOException zu manipulieren („Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.“) Natürlich habe ich das umgehen kann Problem durch Kopieren statt Hochladen der hochgeladenen Datei, aber ich kann es immer noch nicht löschen, wenn ich eine bessere Alternative habe.

Irgendwelche Ratschläge? Duffy

+0

vielleicht müssen Sie zuerst den Strom flush()? – Jocke

+0

Paar Fragen: Ist HttpPostedFileBase Ihre eigene Implementierung unter der Haube? (Ich bemerkte, dass es in den Dokumenten abstrakt ist). Wie lautet der Code für FileIsSmallEnough? Normalerweise erhalten Sie diesen Prozessfehler, wenn ein Teil Ihres eigenen Codes über dem Punkt des Problems sich selbst nicht geschlossen/entsorgt hat und dafür gedacht ist, Dateigriffe zu speichern. Die statische Helper-Klasse File enthält ein paar Methoden, die Objekte zurückgeben, die Dateien enthalten, zum Beispiel, wenn Sie nicht diese Pot-Glück haben, wenn der GC es gelöscht, bevor Sie es verwenden müssen. –

+0

@Jocke: Ich habe auch versucht, flush(). Kein Unterschied. – duffy

Antwort

2

Wie Sie in Ihren Kommentaren erwähnt haben, laden Sie eine Image Datei aus. Die MSDN-Dokumentation besagt, dass die Datei gesperrt bleibt, bis das Bild entsorgt wird.

http://msdn.microsoft.com/en-us/library/stf701f5.aspx

Ihr Bild entsorgen, können Sie entweder rufen Sie die Dispose Methode auf der Instanz, oder den bevorzugten Mechanismus der using Anweisung:

private bool FileIsSmallEnough() 
{ 
    using (Image i = Image.FromFile()) 
    { 

    } 
} 

Dies das Problem lösen soll.

+0

Das war's, danke !!! – duffy

Verwandte Themen