programing

PHP에서 다운로드할 파일을 생성한 후 리디렉션

stoneblock 2023. 9. 16. 08:30

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로 추적해야 합니다(예: 1초에 한 번). 만약 그런 쿠키가 나온다면(여기에는 중고 플러그인 jQuery cookie가 있습니다.

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

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

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

물론 쿠키, 자바스크립트 등을 수락하려면 브라우저가 필요하다고 말할 수 있지만 작동합니다.

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

따라서 파일을 다운로드하는 전체 과정을 혼란스럽게 하는 방향 전환 헤더를 추가하는 것입니다(헤더를 수집하여 하나의 헤더로 생성한 다음 브라우저로 전송하므로 여러 방향 전환 헤더 IIRC를 설정하여 시도할 수 있습니다).

이것은 꽤 오래된 문제이지만, 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);

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

그러나 IE 사용자가 다운로드 가능한 파일을 자동으로 시작하면 보안 경고 탭이 트리거됩니다.daremon에 의해 요약된 세 가지 방법 모두 이 경고를 보여줍니다.당신은 도저히 이 일을 피할 수 없습니다.당신이 진짜 링크를 제공한다면 당신은 더 나은 서비스를 제공받을 수 있습니다.

<?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를 이용한 해결 방법은 다음과 같습니다.

자바스크립트에 의존하는 이에 대한 한 가지 해결책을 발견했습니다. 그래서 정확히 안전하지는 않지만, 안전하지 않은 중요한 사이트에서는 작동하는 것 같습니다.

다운로드 스크립트를 가리키도록 설정된 작업과 함께 '다운로드' 버튼이 있는 양식을 가지고, 자바스크립트를 사용하여 다운로드 버튼을 떼어내고 화면의 메시지를 대체하는 온서브 핸들러에 무엇인가를 놓습니다.다운로드가 계속 진행되고 화면이 바뀝니다.분명히 다운로드 스크립트에 문제가 있다면 작동하지 않더라도 다운로드에 성공한 것처럼 보이지만, 지금으로서는 최고입니다.

업데이트: 새 솔루션:

<a id="download-link" 
   href="https://example.com/uploads/myfile.pdf" 
   class="btn">Download</a>

<script>
    jQuery(document).ready(function(  ) {
        jQuery("#download-link").click(function(e) {
            e.preventDefault(); 
            var url = jQuery(this).attr('href');
            var _filename = url.split('/');
            _filename = _filename[_filename.length - 1];
            console.log(_filename);
        
            fetch(url, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json; charset=utf-8'
                },
            })
            .then(response => response.blob())
            .then(response => {
                const blob = new Blob([response], {type: 'application/pdf'});
                const downloadUrl = URL.createObjectURL(blob);
                const a = document.createElement("a");
                a.href = downloadUrl;
                a.download = _filename;
                document.body.appendChild(a);
                a.click();
            });
        
        });
    });
</script>

원천

이전 답변:

답은 다음과 같습니다.
일입니다!
합니다:의지이다세다이지uef세:t의.

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);
            }

        }

URL과 파일 내용을 나타내는 매개 변수로 리디렉션을 시도할 수 있습니다.그리고 리디렉션에서 다운로드할 파일 내용을 출력할 수 있습니다.

다음을 사용하여 CSV 다운로드가 포함된 PHP 파일을 시작합니다.

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

아니면

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

함수 서 .popoutWin

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

그러면 창이 열리고 CSV 다운로드 프롬프트가 표시된 다음 창을 닫고 프롬프트만 남습니다.

음...

아래의 코드를 사이트 메인 자바스크립트에 입력하세요.

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

설명:이것은 당신이 구별할 어떤 url로 php와 함께 정상적인 방향전환을 하고 자바스크립트에서 다음과 같이 말합니다.경로 이름이 리디렉션에서 '/url_of_redirect/'로 만든 경로와 동일하면 새 페이지에서 URL을 열고 다운로드를 생성합니다.

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