PHP - 文件输出、Excel导出、Curl

文件输出


        //打开句柄
        $handle = @fopen($fileurl, 'r');
        if (!$handle) {
            return msgInfo(500506, '证书不存在');
        }

        ob_start(); //打开缓冲区
        header("Content-type:  application/octet-stream ");
        header("Accept-Ranges:  bytes ");
        header("Content-Disposition:  attachment;  filename={$vgw_info['server_name']}.zip"); //下载后的文件名
        $size = readfile($fileurl);
        header("Accept-Length: " . $size);
        exit;

Curl

/**
 * CURL请求
 *
 * @param string $method Post/Get
 * @param [type] $url 
 * @param array $data 
 * @param array $headers
 * @param integer $log 是否记录日志 1是 0否
 * @return array
 */
function CommonRequest($method = 'POST', $url, $data = [], $headers = [], $log = 1, $timeout = 30)
{
    if (empty($headers)) $headers = COMMON_HEADER;
    $curl = curl_init();

    $method = strtoupper($method);

    $curl_data = [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_CONNECTTIMEOUT  =>  $timeout,
        CURLOPT_TIMEOUT => $timeout,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_POSTFIELDS => $data,
        CURLOPT_HTTPHEADER => $headers,
    ];

    if ($method == 'GET') unset($curl_data[CURLOPT_POSTFIELDS]);
    curl_setopt_array($curl, $curl_data);

    $sContent = curl_exec($curl);
    // 获取状态码
    $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
    // 根据头大小去获取头信息内容
    $result['httpCode'] = $httpCode;
    $result['response'] = json_decode($sContent, 1);

    $res = [
        'url'       => $url,
        'data'      => is_array($data) ? $data : (strstr($data, '{') ? json_decode($data, 1) : $data),
        'httpCode'  => $result['httpCode'],
        'response'  => $result['response'],
        'headers'  => $headers,
    ];

    //日志
    if ($log) {
        debugLog('requests', $method . '-result', $res);
    }

    return $result;
}

文件导出

使用 phpoffice/phpspreadsheet 插件

业务代码

  //标题
  $title = array($tran_info['title'] . ':', $filename);
  //存在数据  
  if (isset($result['result'][0])) {
      //表头
       foreach ($result['result'][0] as $key => $val) {
          $listTitle[] = $tran_info[$key];
       }
       $data[] = $listTitle;
  
       //表格内容
       foreach ($result['result'] as $key => $val) {
           foreach ($val as $k => $v) {
              $listData[] = $v;
           }
           $data[] = $listData;
           unset($listData);
       }
  }
  //文件名
  $filename = str_replace('+', '%20', urlencode($filename));
  //获取文件地址
  $file_path = export_excel($data, $title, $filename, 'save');
  //TP自带函数下载文件   force强制下载
  return download($file_path, $filename)->force(true);

通用导出代码

/**
 * 数组转xls格式的excel文件
 * @param $data 表格内容
 * @param $title 表头
 * @param $output_mode 输出方式 output直接输出 save保存服务器后返回文件地址
 * @throws PHPExcel_Exception
 * @throws PHPExcel_Reader_Exception
 * @throws PHPExcel_Writer_Exception
 */
function export_excel($data, $title, $filename, $output_mode = 'output')
{

    $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();

    //表头
    //设置单元格内容
    $titCol = 'A';
    foreach ($title as $key => $value) {
        // 单元格内容写入
        $sheet->setCellValue($titCol . '1', $value);
        $titCol++;
    }

    $row = 2; // 从第二行开始
    foreach ($data as $item) {
        $dataCol = 'A';
        foreach ($item as $value) {
            // 单元格内容写入
            $sheet->setCellValue($dataCol . $row, $value);
            $dataCol++;
        }
        $row++;
    }

    header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
    header('Content-Disposition: attachment;filename="' . $filename . '.xlsx"'); //加双引号 目的与tp6的download函数头部一致

    header('Cache-Control: max-age=0');

    $writer = \PhpOffice\PhpSpreadsheet\IOFactory::createWriter($spreadsheet, 'Xlsx');

    //直接输出文件流
    if ($output_mode == 'output') {
        $writer->save('php://output');
        exit;
    }
    //保存到服务器后再返回文件地址
    else  if ($output_mode == 'save') {
        $path = 'storage/export/' . $filename . '.xlsx';
        $writer->save($path);
        return root_path() . 'public/' . $path;
    }
}
posted @ 2023-01-10 17:08  Myifb  阅读(167)  评论(0编辑  收藏  举报