다운로드하지 않고 브라우저에서 파일을 강제로 열려면 어떻게합니까 (PDF)?


210

"브라우저에서 PDF 표시"옵션을 선택하지 않은 경우 브라우저에서 PDF 파일을 강제로 열 수있는 방법이 있습니까?

embed 태그와 iframe을 사용해 보았지만 해당 옵션을 선택한 경우에만 작동합니다.

어떡해?

답변:


419

브라우저에 파일을 보도록 브라우저에 알리려면 HTTP 응답에 다음 헤더가 포함되어야합니다.

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

보지 않고 파일을 다운로드 하려면 :

Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"

파일 이름에 특수 문자가 포함 된 경우 파일 이름을 따옴표로 묶어야합니다 filename[1].pdf.

HTTP 응답 헤더를 설정하는 방법은 HTTP 서버에 따라 다릅니다 (또는 서버 측 코드에서 서버 응답 : 서버 측 프로그래밍 언어).


13
강제로 다운로드하려면 Content-Type : application / octet-stream을 사용하십시오.
Papick G. Taboada 2012

25
@ PapickG.Taboada 그러나 사용자 시스템은 파일 유형을 알지 못할 수 있습니다. 예를 들어 일부 사용자는 PDF 파일에 대해 "이 유형의 파일을 항상 엽니 다"를 선택했을 수 있습니다. 아마도 사용자의 환경 설정을 무시하려면 옥텟 스트림을 사용하는 것이 좋지만 올바른 유형과 제안 된 파일 이름을 제공하는 것이 다운로드를 제공하는 "올바른"방법입니다.
ColinM

2
안녕하세요 @ColinM 여기 조금 혼란 스럽습니다 ... PDF 렌더링에 문제가 있습니다. 단지 스크램블 된 텍스트를 제공합니다. Content-Type : application / pdf Content-Disposition : inline; "filename.pdf"? 'cos, angular-js 코드를 사용하여 업로드합니다. 내 질문은 업로드하기 전에 콘텐츠 유형을 설정해야합니까? 또한 백엔드 팀에서 파일 경로를 제공하는 URL 인 링크 만 가져옵니다.이 파일은 다음을 사용하여 새 탭에서 엽니 다 .window.open (url, '_blank'). focus ();
Kailas

3
@Kailas 나는 당신이하려는 일을 이해하지 못합니다. 대답은 PDF 파일에 대한 HTTP 요청에 응답 할 때 서버가 클라이언트에게 보내야하는 헤더를 말합니다. 이 헤더는 파일 업로드에 영향을 미치지 않으므로 클라이언트가 다운로드 할 때마다 URL 뒤의 코드가 헤더를 설정해야합니다.
ColinM

1
@ColinM 감사합니다 친구, 당신이 말했듯이, 우리가 디버깅 할 때의 문제는 파일을 업로드하는 동안 MIME 유형이 설정되었다는 것입니다. 이는 백엔드 팀이 수행해야합니다. Java 스크립트에서 헤더를 추가하는 방법에 대한 코드를 얻으려고했지만 성공하지 못했습니다. 고마워, 내가 당신에게서 실제 아이디어를 얻었을 때 ... :)
Kailas

19

HTML5를 사용하고 있다면 (현재는 모든 사람들이 사용한다고 생각합니다)라는 속성이 download있습니다.

예를 들어

<a href="somepathto.pdf" download="filename">

다음은 filename선택 사항이지만, 제공하는 경우, 다운로드 한 파일이 이름을 소요됩니다.


2
서버 코드를 제어 할 수있는 경우 동일한 첨부 파일 이름 생성 코드를 사용할 수 있으므로 '첨부 파일'을 사용해야합니다. 서버를 제어 할 수없는 경우이 방법이 좋습니다.
Christophe Roussy

그러나 이것은 언제나 그렇듯이 IE가 우리를 사용하지
못하게 막고

1
이는 도메인 전체에서 작동하지 않습니다 (예 : 동일 출처 정책이 방해가 됨). 한 도메인에서 다운로드하는 경우 컨텐츠가 다른 도메인에 저장된 경우 다운로드 속성이 작동하지 않습니다. CORS는 해당 내용을 통과하도록 허용 할 수 있습니다 (테스트되지 않음).
vol7ron

59
이것은 문자 그대로 OP가 요구하는 것과 반대입니다 :)
Chuck Le Butt

1
그렇습니다! : \ 나는 질문을 잘못 이해하고 대답했다. 그러나 많은 사람들이 반대의 결과만을 찾아 여기에 왔기 때문에 답을 편집하거나 제거하지 않은 이유입니다.
Akshay

16

올바른 유형은 application/pdfPDF가 아닌 PDF에 대한 것 application/force-download입니다. 이것은 일부 레거시 브라우저의 해킹처럼 보입니다. 가능하면 항상 올바른 MIME 유형을 사용하십시오.

서버 코드를 제어 할 수있는 경우 :

  • 강제 다운로드 / 프롬프트 : 사용 header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • 브라우저가 열려고 시도합니다 : 사용 header("Content-Disposition", "inline; filename=myfilename.myextension");

서버 코드를 제어 할 수 없습니다 :

참고 : 자세한 정보가 있고 공통 코드를 사용할 수 있으므로 서버 측에서 파일 이름을 설정하는 것이 좋습니다.


2

아파치가 있다면 이것을 .htaccess파일에 추가 하십시오 :

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>

여러 개의 확장을 어떻게 추가 할 수 있습니까? DOC 및 XLS 확장도 추가하고 싶습니다. 친절하게 제안하십시오. 미리 감사드립니다.
Kamlesh 2016 년

그것은 요구되는 것과 반대입니다
Quentin

1

이전 게시물에 입력 오류가있었습니다.

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

브라우저에서 사용자에게 프롬프트를 표시하지 않으려면 "첨부 파일"대신 세 번째 문자열에 "인라인"을 사용하십시오. 인라인은 매우 잘 작동합니다. 사용자에게 열기를 클릭하도록 요청하지 않고 PDF가 즉시 표시됩니다. "첨부 파일"을 사용했는데 사용자에게 열기, 저장을 요청하는 메시지가 표시됩니다. 브라우저 설정 너트를 변경하려고했지만 프롬프트가 표시되지 않습니다.


4
어떤 이전 게시물?
Peter Mortensen

0

이것은 ASP.NET MVC 용입니다.

cshtml 페이지에서 :

<section>
    <h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
    <object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
        <h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
    </object>
</section>

컨트롤러에서 :

public ActionResult Download(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        return File(model.FilePath, "application/pdf", model.FileName);
    }

public FileStreamResult View(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);

        return File(fs, "application/pdf");
    }

-1

다음은 firefox에서 잘 작동하지만 크롬 및 모바일 브라우저에서는 작동하지 않습니다.

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

크롬 및 모바일 브라우저 오류를 해결하려면 다음을 수행하십시오.

  • 프로젝트의 디렉토리에 파일을 저장하십시오.
  • Google PDF 뷰어 사용

Google PDF 뷰어는 다음과 같이 사용할 수 있습니다.

<iframe src="http://docs.google.com/gview?url=http://example.com/path/to/my/directory/pdffile.pdf&embedded=true" frameborder="0"></iframe>

-4

루트 파일에서 downloads.php를 엽니 다.

그런 다음 186 행으로 이동하여 다음으로 변경하십시오.

        if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
            $mime = getimagesize($download_location);
            if(!empty($mime)) {
                header("Content-Type: {$mime['mime']}");
            }
        }
        elseif(preg_match("/\.pdf/i", $name)){
            header("Content-Type: application/force-download");
            header("Content-type: application/pdf");
            header("Content-Disposition: inline; filename=\"".$name."\";");
        }

        else{
            header("Content-Type: application/force-download");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"".$name."\";");
        }

7
그들이 PHP를 사용한다는 언급은 없습니다. 백엔드가 Python 또는 .NET이면 어떻게 되나요?
Maxime Rouiller

1
... 왼쪽 외곽에 대해 이야기하십시오. 그는 자신이 말하는 프레임 워크조차 말하지 않습니다.
Archonic

-4

다음과 같은 방법으로이를 수행 할 수 있습니다.

<a href="path to PDF file">Open PDF</a>

PDF 파일이 일부 폴더 안에 있고 해당 폴더에 해당 폴더의 파일에 직접 액세스 할 수있는 권한이없는 경우 다음과 .htaccess같은 방법으로 파일 설정을 사용하여 일부 파일 액세스 제한을 우회해야합니다 .

<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
    Order Allow,Deny
    Allow from all
</FilesMatch>

그러나 이제 필요한 특정 파일 만 허용 하십시오.

이 코드를 사용했으며 완벽하게 작동했습니다.


그들이 아파치를 사용한다는 언급은 없습니다. 그들이 IIS를 사용한다면 어떨까요? 아니면 표현?
Maxime Rouiller 2016


-7

다음은 PHP에서 브라우저에서 파일을 보도록하는 또 다른 방법입니다.

$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
        echo '<html>'
                .header('Content-Type: application/'.$extension).'<br>'
                .header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
                .'<body>'
                .'<object   style="overflow: hidden; height: 100%;
             width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
                    <embed src="'.$url.'" type="application/'.$extension.'" />
             </object>'
            .'</body>'
            . '</html>';

1
header요청 본문 출력을 시작한 후에는 작동하지 않습니다 (그리고 HTML 문서에서 연결하기위한 문자열을 반환하지 않습니다)
Quentin

-9

Adobe Reader, 메뉴 → 편집환경 설정인터넷 을 연 다음 브라우저 모드로 변경하거나 다른 브라우저에서 자세한 지침을 보려면 브라우저에서 PDF 표시 | Acrobat, Acrobat Reader .


3
AdobeReader를 사용하지 않거나 윈도우를 사용하지 않으면 어떻게됩니까? 당신은 대답이 작동하지 않습니다. 또한 실제 환경에서는 할 수없는 설정 변경을 사용자에게 요청해야합니다.
Clawfire

-12

.PDF에 링크하면 브라우저에서 열립니다.
확인란이 선택되어 있지 않으면 .zip으로 연결되어 강제로 다운로드됩니다.

.zip이 옵션이 아닌 경우 PHP에서 헤더 를 사용 하여 강제로 다운로드

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 

예, 그러나 다운로드하지 않도록 브라우저에서 강제로 열 수있는 방법이 필요합니다. 나는 그것이 가능한지 전혀 모른다.
elloalisboa 2016 년

2
다운로드를 강요하지 않으면 브라우저에서 강제로 열어야합니다. 브라우저에서 열리지 않으면 사용자가 특정 설정을 가지고 있기 때문에 무시할 수 없거나 PDF 읽기 소프트웨어가 없기 때문입니다.
Kirk Strobeck

1
사실, 내 대답을 참조하십시오.
Gabriel Ryan Nahmias

21
이것은 잘못이다. 응용 프로그램 / 강제 다운로드가 없습니다. alskjdsdjk / aljksdlasdj도 사용할 수 있습니다. 이 MIME 유형을 모르기 때문에 브라우저가 다운로드됩니다. 다운로드 오른쪽 마임 타입 것 나 응용 프로그램 / octet-stream을
Papick G. Taboada
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.