我一直用这个撞墙撞墙,并搜索了这个网站和其他人如何解决:
我有两个表单,一个是用户填写报价的弹出窗口,然后该对话框关闭,然后返回主表单以便与客户进行通信并附上报价的PDF。一切正常,直到我尝试不在新窗口中打开或附加到现有表单。我已成功通过ajax调用它,但我没有收到结果,尽管它在服务器上生成的临时文件是正确的。
JS向makepdf.php提交引用:
function generatepdf(forminfo) {
$.ajax({
url: $(form).attr("action"),
type: 'POST',
data: forminfo,
beforeSend: function() {
$("#qmessage").html("Preparing quote..");
},
success: function(data) {
$("#qmessage").html(data);
//$('.multifile:last').val(data);
}
});
};
makepdf.php的PHP:
$pdf_filename = tempnam(sys_get_temp_dir(), "pdf");
if(!file_exists($pdf_filename) || is_writable($pdf_filename)){
$pdf->Output($pdf_filename, "F");
} else {
exit("Path Not Writable");
}
$pdf->Output($pdf_filename, F);
echo $pdf_filename;
它不是将结果写入qmessage div,而是将文件保存在服务器上。我没有看到将服务器端文件附加回现有<input type="file" class="multifile">
字段的方法。
编辑:两个表单都在同一页面上,因此在它们之间传递变量不是问题。它将FPDF输出返回到页面并将其附加到另一个表单(应该可以通过.val()函数执行吗?)
答案 0 :(得分:0)
将其附加到表单中的问题是文件已经是服务器端(它创建的临时文件......)
您可以做的是将输出(该文件的文件路径)附加到隐藏的输入以在您的第二个表单上处理...例如:
AJAX:
$.ajax({
url: $(form).attr("action"),
type: 'POST',
data: forminfo,
beforeSend: function() {
$("#qmessage").html("Preparing quote..");
},
success: function(data) {
$("#hidden_input").val(data);
}
});
makepdf.php的PHP:
$pdf_filename = tempnam(sys_get_temp_dir(), "pdf");
if(!file_exists($pdf_filename) || is_writable($pdf_filename)){
$pdf->Output($pdf_filename, "F");
} else {
exit("Path Not Writable");
}
$pdf->Output($pdf_filename, F);
echo $_SERVER['DOCUMENT_ROOT'] . "/path/to/" . $pdf_filename;
然后是次要形式:
...
-- HTML the jQuery will set the value --
<input type="hidden" name="generatedpdf" id="hidden_input" value="">
最后处理器PHP:
...
$file_location = $_POST['generatedpdf'];
// Code here to deal with pdf
// after finished - remove temperary pdf:
unlink($file_location);
...
不是100%确定这是否是您对最终输出的预期 - 但它是一个选项...... 干杯!
答案 1 :(得分:0)
你说它是在服务器上创建文件,这意味着FPDF库已正确安装并正常工作。
现在问题是将输出作为文件名发送,以便javascript可以使用AJAX请求打印它。
请检查您是否通过在浏览器中键入url和参数直接执行,FPDF库是否返回您要查找的文件名。如果不是,则可能存在php头的问题,这些问题在文件输出之前发送。
之前可能会发送PHP标头,尝试使用ob_start函数,这样就不会出现会话问题。