我有一个简单的脚本,他将数据写入MySQL的文本文件并将文件拖放到即时下载中,我的表单选择输入中有很少的帖子参数,所以如果我改变一些东西并按下提交按钮来排序我的数据并写进入文件,我得到旧数据的文件,这是以前,所以主要的问题是,如果我想在我更改我的过滤器后得到好的信息我需要做总是两个提交和第二次提交给我一个良好的文件与最后的信息。我怎么能防止这个问题?
public function all()
{
$this->load->helper('file');
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="orders_all.txt"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: '.filesize('./assets/downloads/orders_all.txt'));
$data = array(
'customer_id' => $this->input->post('customer_id', TRUE), // Params from select inputs
'product_id' => $this->input->post('product_id', TRUE),
'state' => $this->input->post('state', TRUE),
'date' => $this->input->post('date', TRUE)
);
$result = $this->orders_model->get_orders_by_filter($data);
$str = '';
foreach ($result as $row)
{
$str .= $row['customer_title'] . ';' . $row['product_title'] . ';' . $row['product_code'] . ';' . $row['quantity'] . ';' . $row['created_at']."\r\n";
}
if (write_file('./assets/downloads/orders_all.txt', $str))
{
readfile('./assets/downloads/orders_all.txt');
}
}
答案 0 :(得分:3)
你的content-length
会出错,因为它正在读取一个不存在的文件。
如果您只是为要下载的人编写文件,那么一起跳过该步骤(如果两个人同时调用脚本,也会导致问题!):
相反,你可以这样做:
header('Content-Length: ' . strlen($str));
echo $str;
即。在计算字符串后移动内容长度标题,只发送字符串而不写入文件。
如果你必须写文件,那么只需将标题移到底部的“if”
if (write_file('./assets/downloads/orders_all.txt', $str))
{
header('Content-Length: '.filesize('./assets/downloads/orders_all.txt'));
readfile('./assets/downloads/orders_all.txt');
}