development

PHP는 다운로드 할 파일을 생성하고 리디렉션합니다.

big-blog 2020. 12. 8. 18:52
반응형

PHP는 다운로드 할 파일을 생성하고 리디렉션합니다.


헤더를 사용하여 다운로드해야하는 CSV 파일을 생성하는 PHP 앱이 있습니다. 다음은 코드의 관련 부분입니다.

header('Content-Type: application/csv'); 
header("Content-length: " . filesize($NewFile)); 
header('Content-Disposition: attachment; filename="' . $FileName . '"'); 
echo $content;
exit(); 

내가하고 싶은 것은 파일이 빌드되고 다운로드 프롬프트가 전송 된 후 사용자를 새 페이지로 리디렉션하는 것입니다. header("Location: /newpage")예상대로 끝에 추가 하는 것만 으로는 작동하지 않았기 때문에이를 어떻게 설정해야할지 모르겠습니다.


100 % 확신 할 수는 없지만 이것이 가능하다고 생각하지 않습니다.

일반적인 것 (예를 들어 인기 다운로드 사이트에서)이 반대입니다 : 먼저이로 이동 한 후 다음 다운로드 시작 페이지.

따라서 사용자를 다음과 같은 최종 페이지 로 리디렉션합니다 .

다운로드가 자동으로 시작됩니다. 그렇지 않으면을 클릭하십시오 [a href="create_csv.php"]here[/a].

다운로드 시작 (예 : create_csv.php 자동 호출)과 관련하여 다음과 같은 여러 옵션이 있습니다.

  • HTML : [meta http-equiv="refresh" content="5;url=http://site/create_csv.php"]
  • 자바 스크립트 : location.href = 'http://site/create_csv.php';
  • iframe : [iframe src="create_csv.php"][/iframe]

정말 필요한 경우에 아주 쉽게 할 수 있습니다.

하지만 자바 스크립트와 쿠키에서 약간의 작업이 필요합니다.

PHP에서는 쿠키 설정을 추가해야합니다.

header('Set-Cookie: fileLoading=true'); 

그런 다음 다운로드를 호출하는 페이지에서 JS로 추적해야합니다 (예 : 초당 한 번). 이와 같은 쿠키가있는 경우 ( 여기에 플러그인 jQuery 쿠키 가 사용됨 ) :

setInterval(function(){
  if ($.cookie("fileLoading")) {
    // clean the cookie for future downoads
    $.removeCookie("fileLoading");

    //redirect
    location.href = "/newpage";
  }
},1000);

이제 파일이 다운로드되기 시작하면 JS가이를 인식하고 쿠키가 삭제 된 후 필요한 페이지로 리디렉션됩니다.

물론 쿠키, JavaScript 등을 허용하려면 브라우저가 필요하다고 말할 수 있지만 작동합니다.


보내는 헤더는 HTTP 헤더입니다. 브라우저는이를 페이지 요청으로 받아들이고 페이지로 처리합니다. 그리고 귀하의 경우에는 다운로드해야하는 페이지입니다.

따라서 여기에 리디렉션 헤더를 추가하면 파일 다운로드의 전체 프로세스가 혼동됩니다 (헤더가 수집되어 하나의 헤더로 생성 된 다음 브라우저로 전송되므로 여러 리디렉션 헤더 IIRC를 설정하여 시도 할 수 있습니다)


그러나 IE 사용자를 위해 다운로드 가능한 파일을 자동으로 시작하면 보안 경고 탭이 트리거됩니다. daremon이 설명한 세 가지 방법 모두이 경고를 표시합니다. 당신은 단순히 이것을 피할 수 없습니다. 실제 링크를 제공하면 더 나은 서비스를받을 수 있습니다.


나는 자바 스크립트에 의존하는 하나의 해결 방법을 찾았으므로 정확히 안전하지는 않지만 안전하지 않은 중요 사이트의 경우 작동하는 것 같습니다.

작업이 다운로드 스크립트를 가리 키도록 설정된 '다운로드'라는 버튼이있는 양식을 만든 다음 자바 스크립트를 사용하여 다운로드 버튼을 제거하고 화면의 메시지를 대체하는 onsubmit 핸들러에 무언가를 배치합니다. 다운로드는 계속되고 화면이 변경됩니다. 분명히 다운로드 스크립트에 문제가 있으면 실행되지 않더라도 다운로드가 성공한 것처럼 보이지만 지금은 내가 가진 최선의 방법입니다.


이것은 꽤 오래된 문제이지만 여기에 JS를 통해 달성 한 방법이 있습니다.

// Capture the "click" event of the link.
var link = document.getElementById("the-link");
link.addEventListener("click", function(evt) {
  // Stop the link from doing what it would normally do.
  evt.preventDefault();
  // Open the file download in a new window. (It should just
  // show a normal file dialog)
  window.open(this.href, "_blank");
  // Then redirect the page you are on to whatever page you
  // want shown once the download has been triggered.
  window.location = "/thank_you.html";
}, true);

통해-https: //www.daniweb.com/web-development/php/threads/463652/page-not-redirecting-after-sending-headers-in-php


<?php 
    function force_file_download($filepath, $filename = ''){
        if($filename == ''){
            $filename = basename($filepath);
        }

        header('Content-Type: application/octet-stream');
        header("Content-Transfer-Encoding: Binary"); 
        header("Content-disposition: attachment; filename=\"" . $filename . "\""); 
        readfile($filepath); // do the double-download-dance (dirty but worky)  
    }

    force_file_download('download.txt');
?>
<script type="text/javascript">
    location = 'page2.php'
</script>

다음은 javascript를 사용하는 솔루션입니다.


You can try and redirect to the URL plus a parameter that represents the file contents. And in the redirect, you can output the file content for download.


Launch the PHP file which contains the CSV download using:

<a onclick="popoutWin(\'csvexport.php\')" >Download CSV File</a>

or

<input name="newThread" type="button" value="Download CSV File"
        onclick="popoutWin(\'csvexport.php\')" />

where the JavaScript function popoutWin is

/*
 * Popout window that self closes for use with downloads
 */
function popoutWin(link){
    var popwin = window.open(link);
    window.setTimeout(function(){
        popwin.close();
    }, 500);
}

This will open a window, to display the CSV download prompt and then immediately close the window, leaving only the prompt.


Here is the answer:
It's work!
You need three different parts of code:

HTML

<a id="download_btn" class="btn btn-primary" href="?file=filename&download=1">Download<&/a>


JQuery

$('#download_btn').click(function(){
    window.location.href = '<?=base_url()?>/?file=<?=$file;?>&download=1';
}).focusout (function(){
    window.location.href = '<?=base_url()?>';
    return false;
});


PHP

        if(isset($_GET['download']) && isset($_GET['file'])){

            $zip_path = 'path_to/'.$_GET['file'].'.zip';

            if(file_exists($zip_path)){
                header('Content-Type: application/zip');
                header('Content-Disposition: attachment; filename="'.basename($zip_path).'"');
                header('Content-Length: ' . filesize($zip_path));
                header('Location: '.$zip_path);
            }

        }

Hmmmm...

Put the code below in the main javascript of the site.

 if (window.location.pathname == '/url_of_redirect/') {
        window.open(location.protocol + '//' + location.hostname + '/url_of_download.zip', '_parent');
    }

Explaining: It does the normal redirect with php to some url you will difine and in javascipt it says: If the pathname is the same as the path that redirect made '/url_of_redirect/' then it opens the url on a new page, generating the downlod.

참고URL : https://stackoverflow.com/questions/822707/php-generate-file-for-download-then-redirect

반응형