2011-08-04 4 views
2

CMS와 같이 관리자 측에서 폴더로 파일을 업로드하려고합니다. 프런트 엔드에 파일 다운로드 링크가 표시됩니다. 관리자 쪽에서 참조를 삭제할뿐만 아니라 서버에서 실제 파일을 제거하고 싶습니다. 여기 ASP.NET MVC3의 서버에서 업로드 된 파일 삭제하기

는 업로드 된 파일에 저장 내 컨트롤러의 일부인 다음 Create보기에서

[HttpPost] 
public ActionResult Upload(HttpPostedFileBase file) 
{ 
    if (file != null && file.ContentLength > 0) 
    { 
     var fileName = Path.GetFileName(file.FileName); 
     var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName); 
     file.SaveAs(path); 

     ViewBag.fileName = fileName.ToString(); 

     return RedirectToAction("Create", new {fileName = fileName }); 
    } 

    return RedirectToAction("Index"); 
} 

를, 관리자는 다음 문서에 대한 다른 정보를 입력하도록 허용하고이와 함께 테이블에 저장됩니다 fileName.

이제 document.pdf과 같은 문서 이름에 연결할 수 있어야합니다. App_Data 폴더 아래의 업로드 폴더에 연결할 수 있습니까?

또한 삭제시 테이블 행뿐만 아니라 파일을 제거하려면 어떻게해야합니까?

+0

PDF에 대해이 작업이 끝나고 "작동"되었지만 메모리 문제에 대해 걱정할 필요가 있는지 궁금하거나 FileStreamResults가 모든 것을 처리합니까? 'public ActionResult Document (string fileName) {시도 {var fn = fileName; var fpath = Path.Combine (Server.MapPath ("~/App_Data/uploads"), fn); 새로운 FileStreamResult를 반환합니다 (새 FileStream (fpath, FileMode.Open, FileAccess.Read, FileShare.Read), "application/pdf"). } ... ' – Par6

+0

웹 응용 프로그램에서 발생하는 트래픽 양에 따라 다릅니다. 몇 명의 사용자가 있습니까? –

+0

@Alex 대부분 내부 직원이 사용합니다. 기본적으로 트래픽이 많지 않습니다.하지만 좀 더 공개적으로 만들려면 모범 사례 정보에 대한 조언이 필요합니까? 도와 줘서 고마워. – Par6

답변

1

파일 다운로드를 처리 할 별도의 컨트롤러를 만듭니다. 또한 사용자가 직접 파일에 직접 연결할 수 없습니다. DownloadMyFileFromSomeWhere(string)가 BLOB 또는 로컬 서버와 같은 일부 스토리지에서 바이트 배열 파일을 검색 할 수 있어야한다

public ActionResult GetDocument(String pathName) 
{ 
    try 
    { 
     Byte[] buffer = DownloadMyFileFromSomeWhere(pathName); 
     FileContentResult result = new FileContentResult(buffer, "PDF"); // or whatever file ext 
     // these next two lines are optional 
     String[] folders = pathName.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);    
     result.FileDownloadName = folders[folders.Length - 1]; 

     return result; 
    } 
    catch (Exception ex) 
    { 
     // log the error or something 
    } 
    return new HttpNotFoundResult(); 
} 

. 같은 접근을 할 수 있으며, 관리자 측

private Byte[] DownloadMyFileFromSomeWhere(string pathname) 
{ 
    Byte[] file = System.IO.File.ReadAllBytes(Server.MapPath(pathname)); 
    return file; 
} 

: 그것은 같이 보일 수있는 파일과 데이터베이스에서 해당 항목을 삭제하기 위해 별도의 컨트롤러를 작성합니다.

+0

DownloadMyFileFromSomeWhere()가 어떻게 보일지 또는 다른 기사에 대한 참조가 무엇인지 자세히 설명해 주실 수 있습니까? 고마워요, – Joe

+0

@Joe, 웹 서버의 로컬 파일에 간단한 가져 오기 또는 블롭 또는 클라우드에서 다운로드 할 수 있습니다. 'System.IO.File.ReadAllBytes (filePath);를 보면됩니다. –

+1

당신의 대답에 DownloadMyFileFromSomeWhere 메서드를 추가했습니다. – Joe

0

일부 노트 : 당신이 어딘가에 파일을 저장 할 수있는 권한이있는 경우

  • , 당신은 또한 삭제할 수있는 권한이 있어야합니다. 이 작업을 수행하려면 일반 파일 작업을 사용할 수 있습니다.
  • IIS 은 App_Data에서 파일 연결을 차단해야합니다. 당신은 몇 가지 옵션이 있습니다
    • 가 해당 위치에서 파일을 읽고 다시 다른 위치에서 브라우저
    • 스토어를 스트림 작업을 만들기 - 사용자가 실제로에 액세스 할 수 있습니다 곳있다.

첫 번째 옵션의 장점은 두 번째 옵션은에서의 Web.config를 추가 할 필요 반면, 쉽게, 파일에 대한 액세스를 보호하기 위해 귀하의 행동 등 인증을 추가 할 수있다 폴더에 적절한 역할 및 액세스 권한이 있어야합니다. 그러나 다른 한편으로는, 브라우저가 파일을 어떻게 처리 할지를 IIS가 알아 내도록하기보다는, 행동 방법에 적절한 헤더를 제공해야합니다.