2017-04-18 15 views
0

クライアント側にdocxファイルをダウンロードするボタンがあります。ファイルはPHPWordで生成されます。 ChromeでそれがFirefoxで働いていないが:FirefoxでXMLHttpRequestが機能していません

JS:

var req = new XMLHttpRequest(); 
req.open("POST", "/vendor/gendocx.php", true); 
req.responseType = "blob"; 

req.onload = function (event) { 
    var blob = req.response; 
    console.log(blob.size); 
    console.log(blob); 
    var link=document.createElement('a'); 
    link.href=window.URL.createObjectURL(blob); 
    link.download="TEST_this out.docx"; 
    link.click(); 
}; 

req.send(content); 

PHP:

$filename = 'TEST_this out'; 

$objWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpword, 'Word2007'); 

header("Content-Description: File Transfer"); 
header('Content-Disposition: attachment; filename="' . $filename . '"'); 
header('Content-Type: application/vnd.openxmlformats-officedocument.wordprocessingml.document'); 
header('Content-Transfer-Encoding: binary'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Expires: 0'); 

$objWriter->save($filename); 
$objWriter->save("php://output"); 

exit; 

私はすでにこのサイト上の他のソリューションを試みたが、成功しませんでした。この問題で私を助けてくれることを願っています。

エラーメッセージはありません。これは私がそれを得たblob

enter image description here

+2

"動作していません"というのは良い問題ではありません。コンソールにはどのようなエラーメッセージが表示されますか? 'console.log'ステートメントを追加すると、どのコード行が正常に実行されますか? – Quentin

+0

ChromeとFirefoxがAjaxのフェッチをここで扱うのは驚くべきことですが(不可能ではありません)私は彼らが '.download'や自動化された' .click() 'を違った方法で扱っていることに驚くことはありません。障害はどこで発生するのですか? 'onload'は走っているのですか? – apsillers

+0

@quentin in chrome、すべてのコードが正常に実行されています。ブラウザの下部に通常のボタンが表示され、ファイルを開きます。しかし、Firefoxでは、残念ながら何もしません。コンソールにエラーはありません。ステータスコードは200です。 – moody

答えて

0

の結果です。

明らかにFirefoxで私はdocument.body.appendChild(a)をdomに追加する必要があります。

req.onload = function (event) { 
    var blob = req.response; 
    console.log(blob.size); 
    console.log(blob); 
    var link=document.createElement('a'); 
    document.body.appendChild(link); 
    link.href=window.URL.createObjectURL(blob); 
    console.log(link.href); 
    link.download="TEST_this_out.docx"; 
    link.click(); 
    setTimeout(function(){ 
     document.body.removeChild(link); 
    }, 500) 
}; 

ご協力いただきありがとうございます。

関連する問題