asp.net-mvc - 자습서 - asp net source file




ASP.NET MVC에서 파일보기/다운로드로 돌아 가기 (6)

ASP.NET MVC에서 사용자에게 다시 데이터베이스에 저장된 파일을 보내는 문제가 발생했습니다. 내가 원하는 것은 파일을보고 브라우저로 보내지는 mimetype이 어떻게 처리되어야하는지 결정하고 다른 하나는 다운로드를 강제하는 두 링크를 나열한보기입니다.

SomeRandomFile.bak 라는 파일을 SomeRandomFile.bak 하고 브라우저에이 유형의 파일을 열 수있는 연결된 프로그램이 없으면 다운로드 동작을 기본값으로 설정하는 데 아무런 문제가 없습니다. 그러나 SomeRandomFile.pdf 또는 SomeRandomFile.jpg 파일을보기로 선택하면 파일을 열어보기 만하면됩니다. 그러나 파일 형식에 관계없이 다운로드 프롬프트를 강제로 표시 할 수 있도록 측면에 다운로드 링크를 유지하고 싶습니다. 이게 말이 돼?

FileStreamResult 시도하고 대부분의 파일에 대해 작동합니다, 생성자는 기본적으로 파일 이름을 허용하지 않습니다. 그래서 알 수없는 파일은 url에 기반한 파일 이름이 할당됩니다 (내용 유형에 따라 제공되는 확장자를 알지 못함). 파일 이름을 지정하여 강제로 지정하면 브라우저에서 파일을 직접 열 수 없으며 다운로드 프롬프트가 표시됩니다. 다른 사람이이 문제를 겪었습니까?

이것들은 제가 지금까지 시도한 것들의 예입니다.

//Gives me a download prompt.
return File(document.Data, document.ContentType, document.Name);

//Opens if it is a known extension type, downloads otherwise (download has bogus name and missing extension)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType);

//Gives me a download prompt (lose the ability to open by default if known type)
return new FileStreamResult(new MemoryStream(document.Data), document.ContentType) {FileDownloadName = document.Name};

어떤 제안?


FileVirtualPath -> Research \ Global Office Review.pdf

public virtual ActionResult GetFile()
{
    return File(FileVirtualPath, "application/force-download", Path.GetFileName(FileVirtualPath));
}

나는 "문서"변수에 타입 힌팅이 없기 때문에 받아 들인 대답에 문제가있었습니다 : var document = ... 그래서 누군가 다른 사람이 문제를 겪고있는 경우를 대비해 나를 위해 일한 것을 게시하고 있습니다.

public ActionResult DownloadFile()
{
    string filename = "File.pdf";
    string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename;
    byte[] filedata = System.IO.File.ReadAllBytes(filepath);
    string contentType = MimeMapping.GetMimeMapping(filepath);

    var cd = new System.Net.Mime.ContentDisposition
    {
        FileName = filename,
        Inline = true,
    };

    Response.AppendHeader("Content-Disposition", cd.ToString());

    return File(filedata, contentType);
}

아래 코드는 API 서비스에서 PDF 파일을 가져 와서 브라우저에 응답 해주었습니다. 도움이되기를 바랍니다.

public async Task<FileResult> PrintPdfStatements(string fileName)
    {
         var fileContent = await GetFileStreamAsync(fileName);
         var fileContentBytes = ((MemoryStream)fileContent).ToArray();
         return File(fileContentBytes, System.Net.Mime.MediaTypeNames.Application.Pdf);
    }

파일을 보려면 (예 : txt) :

return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain);

파일을 다운로드 하려면 (예 : txt) :

return File("~/TextFileInRootDir.txt", MediaTypeNames.Text.Plain, "TextFile.txt");

참고 : 파일을 다운로드하려면 fileDownloadName 인수를 전달해야합니다.


Darin Dimitrov의 답 이 맞습니다. 그냥 추가 :

Response.AppendHeader("Content-Disposition", cd.ToString()); 응답에 이미 "Content-Disposition"헤더가 있으면 브라우저에서 파일 렌더링을 실패 할 수 있습니다. 이 경우 다음을 사용하는 것이 좋습니다.

Response.Headers.Add("Content-Disposition", cd.ToString());

public ActionResult Download()
{
    var document = ...
    var cd = new System.Net.Mime.ContentDisposition
    {
        // for example foo.bak
        FileName = document.FileName, 

        // always prompt the user for downloading, set to true if you want 
        // the browser to try to show the file inline
        Inline = false, 
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    return File(document.Data, document.ContentType);
}

참고 : 위의 예제 코드는 파일 이름의 국제 문자를 제대로 설명하지 못합니다. 관련 표준화에 대해서는 RFC6266을 참조하십시오. 나는 최근 버전의 ASP.Net MVC의 File() 메소드와 ContentDispositionHeaderValue 클래스가 이것을 적절히 고려한다고 생각한다. - Oskar 2016-02-25





download