문제

헤더를 사용하여 다운로드 해야하는 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이 설명한 세 가지 방법 모두이 경고를 보여줄 것입니다. 당신은 단순히 이것을 돌아 다닐 수 없습니다. 실제 링크를 제공하면 더 나은 서비스를받을 수 있습니다.

이를 위해 JavaScript에 의존하는 하나의 해결 방법을 찾았으므로 정확히 안전하지는 않지만 비 안전한 중요 사이트의 경우 작동하는 것 같습니다.

다운로드 스크립트를 가리 키도록 액션이 설정된 '다운로드'라는 버튼이있는 양식을 사용한 다음 JavaScript를 사용하여 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-recting-fter-sending-meaders-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를 사용하는 솔루션입니다.

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\')" />

JavaScript 기능 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 다운로드 프롬프트를 표시 한 다음 즉시 창을 닫고 프롬프트 만 남깁니다.

다음은 답입니다.
일이야!
코드의 세 가지 부분이 필요합니다.

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

        }

흠 ...

아래 코드를 사이트의 기본 JavaScript에 넣으십시오.

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

설명 : PHP를 사용하여 일부 URL로 정상적인 리디렉션을 수행하고 Javascipt에서는 다음과 같이 말합니다. PathName이 리디렉션 한 경로와 동일하면 '/url_of_redirect/'가 새 페이지에서 URL을 열어 생성합니다. 다운로드.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top