2010-11-19 5 views
0

My Asp.net MVC 앱에 파일 업로드가 필요합니다. 업로드 과정에서 새로 업로드 된 파일을 조작하고 싶습니다.새로 업로드 된 파일을 조작하면 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(); 

이 코드의 문제는 처음에 업로드 된 파일을 조작하는 시도는 IOException이 발생한다는 것입니다 ("다른 프로세스에서 사용 중이기 때문에 프로세스가 파일에 액세스 할 수 있습니다.") 물론 난을 무시할 수 문제는 업로드 된 파일을 이동하는 것보다는 복사하는 것이지만 더 나은 대안을 찾으면 삭제할 수는 없습니다.

어떤 조언이 필요합니까? Duffy

+0

어쩌면 스트림을 먼저 flush()해야합니까? – Jocke

+0

몇 가지 질문 : HttpPostedFileBase가 자체 구현입니까? (나는 문서에서 추상적 인 것으로 나타났습니다). FileIsSmallEnough의 코드는 무엇입니까? 일반적으로, 문제 지점 위에있는 자신의 코드 중 일부가 닫히거나/처리되지 않고 파일 핸들을 고정하도록 설계되었을 때이 프로세스 오류가 발생합니다. File 정적 도우미 클래스에는 파일을 보관하는 객체를 반환하는 몇 가지 메소드가 포함되어 있습니다. 예를 들어, GC를 사용하기 전에 GC를 지우면 냄비를 처분하지 않아도됩니다. –

+0

@Jocke : 나는 플러시()도 시도했다. 차이 없음. – duffy

답변

2

의견에서 언급 한대로 파일에서 Image을로드합니다. MSDN 설명서 이미지가 삭제 될 때까지 파일이 잠긴 상태로 유지됩니다.

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

    } 
} 

이 문제를 해결해야합니다

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

당신은 인스턴스에 Dispose 메소드를 호출하거나 using 문장의 기본 메커니즘을 사용할 수 있습니다, 이미지를 처리합니다.

+0

그게 다 고마워! – duffy

관련 문제