3

ページ1はページ2にリンクしています。ページ2は、次のコードを使用してダウンロードを提供します。

header("Content-disposition: attachment; filename= '$filename'");
header('Content-type: application/pdf');
readfile($file);
header("location: mainpage.php");

その結果、ユーザーは1ページに「留まり」ますが、ダウンロードが提供されます。

ユーザーが1ページに留まるように設定するにはどうすればよいですか。ただし、ダウンロードが提供された後に更新されます。

私はjavascriptを知らないので、純粋なPHPソリューションを望んでいます。

4

5 に答える 5

2

これまでは知りませんでしたが、これは優れたHTTPヘッダーの1つにすぎず、ほとんどの人はHTMLからすでに知っていますRefresh

header次の呼び出しを追加するだけです。

header('Refresh: 0; url=http://stackoverflow.com/');
于 2012-08-03T23:52:06.917 に答える
2

私の意見では、必ずしもpage1を更新する必要はないと思います。page1内のリンクを介してダウンロードを強制できるはずです。下記参照:

リンク付きのPage1.php

<a href="http://www.domain.com/page2.php?pdf=name-of-pdf">Download PDF</a>

Page2.php

$filename = $_GET['pdf'] . '.pdf';

header('Content-type: application/pdf');
header("Content-disposition: attachment; filename= '$filename'");
header("location: $filename");

これにより、ページ1に留まっている間にダウンロードを開始できます。

これがあなたが考えていたものであることを願っています。

于 2012-08-04T00:18:06.997 に答える
0

$_SERVER['HTTP_REFERER']でリファラーを確認できます。したがって、これをpage1.phpに入れることができるはずです。

if($_SERVER['HTTP_REFERER'] == page2.php) {
  echo "<meta http-equiv=\"refresh\" content=\"0;url=http://www.yourdomain.com/page1.php\">";
exit();
}

このようにして、訪問者がpage2.phpから来ているかどうかを確認し、来ている場合は、ブラウザーを更新するメタタグのみを解析します。HTTP_REFERERがpage1.phpになっているため、更新されても再度更新されることはありません。

于 2012-08-03T23:37:46.330 に答える
0

あなたがこれに答えたことがあるかどうかはわかりませんが、私は同じ問題を抱えていました、これが私の解決策ですAJAX jquery

$(function(){

$("#itemList").on("click", "a.downloadLink", function(){ //this binds a click event handler on the itemList container that will listen out for any a with class of downloadLink inside it being clicked

       var link = $(this);
       var item = link.parent();
       var forId = item.data("itemid");
       var started = new Date(); //the alternative to tracking time elapsed is to just use a simple counter you increment - "poll 5 times" etc. if your doing .5 second intervals, then 5 times = 2.5 seconds for example. Time elapsed may result in less polls, if a poll takes a long time to return, for example. Use whichever approach feels better.
       var maxTime = 5000; //5 seconds
       function poll(){
             $.ajax({
                type: "POST",
                url: "Watergetstatus.php", 

                  data: {FID: forId},   //this will be turned into a request for page1?forId=1&oldValue=2  - I expect it in this example to return a json-encoded response of {"changed":true|false, "newHtml":"replacementContent on success"}
                  datatype :'json',
                  success: function(data){
                         if (data.changed=true)
                         {
                         window.location.reload(true);
                         }
                         else {
                               var elapsed = (new Date())-started;
                               //window.location.reload(true);
                               if (elapsed <= maxTime) setTimeout(poll, 500); // Poll again in .5 seconds
                               //else you can assume the link didn't open / work / the database never changed etc - handle or ignore as needed
                          }
                   },
                   error: function() {
                       alert("borken");  //the request to the server bombed out; up to you if you want to simply re-queue for another try like above until the expiry time or if you want to show an error or just simply ignore it.
                   }
             });
       }

       setTimeout(poll, 500); //wait 0.5 seconds before polling
});

});

HTMLには動的リンクの大規模なリストがありました

<div data-itemid="<?php echo $row_Files['FID']; ?> " >
<a class="downloadLink" href="PLC_FILES/WaterCheckOut.php?FID=<?php echo $row_Files['FID']; ?> " target=""><img src="PLCImages/download.fw.png"></a>
</div>

ポーリングファイルwatergetstatus.php

mysql_select_db($database_PLC, $PLC);
$query_files = "SELECT * FROM files WHERE FID = '{$_POST['FID']}'";
$files = mysql_query($query_files, $PLC) or die(mysql_error());
$row_files = mysql_fetch_assoc($files);
$totalRows_files = mysql_num_rows($files);

if($row_files['Status'] ==2)
{
        $data= array("changed"=>true); 
        echo json_encode($data);
}
else
{
        $data= array("changed"=>false); 
        echo json_encode($data);
}

ダウンロードファイルリンクwatercheckout.php

if ( $row_files['Status']==1 ) {

$file_path  = $row_files['FileName'];;
$path_parts = pathinfo($file_path);
$file_name  = $path_parts['basename'];
$file_ext   = $path_parts['extension']; 

 $content_types = array(
            "exe" => "application/octet-stream",
            "zip" => "application/zip",
            "mp3" => "audio/mpeg",
            "mpg" => "video/mpeg",
            "avi" => "video/x-msvideo",
    );
    $ctype = isset($content_types[$file_ext]) ? $content_types[$file_ext] : $ctype_default;



$file = $row_files['FileName'];
$path = "Historical/".date('Y-m-d-His');
$newfile = $path."_".$file;
$today = date('Y-m-d H:i:s');

header('Content-disposition: attachment; filename='.$file);
header("Content-Type: " . $ctype);
header('Content-Length: ' . filesize($file));
header('Content-Transfer-Encoding: binary');
header('Cache-Control: must-revalidate');
header('Pragma: public');
mysql_select_db($database_PLC, $PLC);
mysql_query("UPDATE files SET Status = '2'");

ob_clean();
flush();


readfile($file);
rename($file, $newfile);

コードを簡略化してたくさん切り取ったので、何かが足りないかもしれませんが、これは私が使用した一般的なフレームワークであり、私にとってはうまくいきます

そこにはあまりなかったので、これが誰かを助けることを願っています

于 2014-08-21T02:41:35.280 に答える
-1
//----------------- TOP OF DOWNLOAD_PAGE.PHP ----------------------

$download_code = mysql_real_escape_string(urldecode($_GET['code']));
$download = mysql_real_escape_string(urldecode($_GET['download']));

$self = $_SERVER["PHP_SELF"]."?code=$download_code";

//refresh page after download...

echo"
    <script type=\"text/javascript\">
        function downloadRedirect(){
           var redirect_url = \"$self\";

           setTimeout(\"DoTheRedirect('\"+redirect_url+\"')\",
            parseInt(0.5*1000));
        }
        function DoTheRedirect(url) { window.location=url; }
    </script>
";

...

$filepath = "/var/www/vhosts/YOUR_DOMAIN.com/digital_downloads/";

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

    $file = $_GET['download'];

    if (file_exists($filepath.$download) && 
is_readable($filepath.$download) && (preg_match('/\.zip$/',$download) || preg_match('/\.zipx$/',$download) )) {

...

    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"".$download."\"");
    header("Content-Transfer-Encoding: binary");
    header("Content-Length: ".filesize($filepath.$download));
    ob_end_flush();
    readfile($filepath.$download);


}//end if file_exists


}//end if isset

//----------------- BOTTOM HALF OF DOWNLOAD_PAGE.PHP ----------------------

//link generated to download and call JS to refresh page
echo "<a href=\"".$_SERVER["PHP_SELF"]."?download=$download_id.zipx&code=$download_code\" target=\"_top\" onclick=\"javascript:downloadRedirect()\">Click to Download</a> 
于 2018-08-22T17:13:43.763 に答える