1

我有一个 PHP 函数,它在单击按钮后下载不同的文件(如果我们单击 PDF 按钮,它将加载一个 pdf 文件,如果我们单击 DOC 按钮,它将加载一个 doc 文件)。两个按钮的功能相同。

我的问题是当我下载文件时。如果是PDF,IE会打开另一个页面,然后关闭它并让我选择下载文件,但如果是DOC,IE会打开另一个页面,而不是关闭它。

代码(对我来说)是一样的,我看不出有任何区别。

<pre>
<code>
    public function lettrecadrageAction() {

     $nom = $_POST['type'];
     switch ($nom):

      case 'Fichier DOC' :

       $path = "ddl/lettre_de_cadrage.doc";
       header('Content-Description: File Transfer');
       header("Content-Type: application/force-download");
       header("Content-Disposition: attachment; filename=lettre_de_cadrage.doc");
       header('Content-Transfer-Encoding: binary');
       header('Expires: 0');
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Pragma: public');
       header('Content-Length: ' . filesize($path));
       ob_clean();
       flush();
       readfile($path);
       break;

      case 'Fichier PDF' :

       $path = "ddl/lettre_de_cadrage.pdf";
       header('Content-Description: File Transfer');
       header('Content-Type: application/force-download');
       header("Content-Disposition: attachment; filename=lettre_de_cadrage.pdf");
       header('Content-Transfer-Encoding: binary');
       header('Expires: 0');
       header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
       header('Pragma: public');
       header('Content-Length: ' . filesize($path));
       ob_clean();
       flush();
       readfile($path);
       break;
      endswitch;
     exit;
    }
</code>
</pre>

点击的 Js 动作

<pre>
    <code>
$('.ldc_dl').click(function() {
        var f = document.createElement("form");
        f.method = "POST";
        f.name = "form";
        f.target = "_blank";
        f.setAttribute('style', 'display: none;');
        f.action = "http://" + document.domain + "/Exploitation/lettrecadrage/";
        var fHtml = document.createElement("input");
        fHtml.type = "text";
        fHtml.name = "type";
        fHtml.value = $(this).html();
        console.log(fHtml);
        var fSubmit = document.createElement("input");
        fSubmit.type = "submit";
        f.appendChild(fHtml);
        f.appendChild(fSubmit);
        document.body.appendChild(f);
        f.submit();
        document.body.removeChild(f);

        return true;
    }) </code>
</pre>

按钮的 HTML 代码

<pre>
  <code>
    <div class="tab-pane fade" id="ldc"> 
        <p>La lettre de cadrage est disponible en <button id="ldc_dl_doc" class="btn btn-link ldc_dl" type="button">Fichier DOC</button></p>
        <p> Ou en <button id="ldc_dl_pdf" class="btn btn-link ldc_dl" type="button">Fichier PDF</button></p>
    </div>
  </code>
</pre>

(按钮是“Fichier PDF”和“Fichier DOC”)

编辑 - 解决方案

在评论中 jbl 的帮助下,我使用 iframe 解决了我的问题:

var frame = document.createElement("iframe");
frame.setAttribute("src", "_blank");

并修改我的表单目标

            f.target = frame;
4

2 回答 2

0

Content-Transfer-Encoding标头用于 MIME 电子邮件。通过 HTTP 发送它没有任何意义。

Content-Disposition: attachment;标题表示浏览器保存它而不是在浏览器中打开。因此,Content-Type: application/force-download我建议不要为 PDF 和 DOC 文件使用正确的内容类型:

Content-Type: application/pdf
Content-Type: application/vnd.ms-word
于 2013-06-21T09:24:33.483 回答
0

在评论中 jbl 的帮助下,我使用 iframe 解决了我的问题:

var frame = document.createElement("iframe");
frame.setAttribute("src", "_blank");

并修改我的表单目标

        f.target = frame;
于 2013-06-26T09:14:56.307 回答