【问题标题】:refreshing after php serves a download [duplicate]php提供下载后刷新[重复]
【发布时间】:2012-08-02 00:32:57
【问题描述】:

第 1 页链接到第 2 页。第 2 页使用以下代码提供下载:

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

结果是用户“停留”在第 1 页上,但提供了下载服务。

如何进行设置,以便用户保留在第 1 页上,但在提供下载后它会刷新。

我不懂 javascript,所以我希望有一个纯粹的 PHP 解决方案。

【问题讨论】:

    标签: php javascript header download refresh


    【解决方案1】:

    在我看来,我认为您根本不需要刷新 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 页时开始下载。

    希望这是你的想法。

    【讨论】:

    • 所以你解释我做什么。我想要的,其实是相反的。我需要这种确切的效果,但下载后我需要刷新页面,以便将“下载 pdf”显示为“其他内容”
    【解决方案2】:

    以前不知道这个,但它只是很好的 HTTP 标头之一,我们大多数人已经从 HTML 中知道它:Refresh

    只需添加以下header 调用:

    header('Refresh: 0; url=http://stackoverflow.com/');
    

    【讨论】:

    • 开始下载后,指定的 url 将自动加载 - 没有 HTML 技巧。这不是你想要的吗?
    • 只需将地址替换为用户当前的地址即可。
    【解决方案3】:

    您可以通过 $_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。

    【讨论】:

      【解决方案4】:

      不知道你是否得到了这个答案,但我遇到了同样的问题, 这是我的解决方案 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>
      

      Poling 文件 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);
      

      我已经简化了我的代码并删减了很多,所以它可能会遗漏一些东西,但这是我使用的通用框架,它适用于我

      希望这对某人有所帮助,因为那里没有太多内容

      【讨论】:

        【解决方案5】:
        //----------------- 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> 
        

        【讨论】:

        • 一个好的答案需要的不仅仅是代码。需要解释它如何回答最初的问题。
        猜你喜欢
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 2015-08-26
        • 2014-09-06
        • 2013-01-06
        • 2013-07-12
        相关资源
        最近更新 更多