PHP | readfile 函數

怎樣輸出文件

最近更新時間 2021-01-19 18:00:23

readfile 函數輸出文件。

讀取文件並寫入到輸出緩衝。

函數定義

readfile ( string $filename , bool $use_include_path = false , resource $context = ? ) : int
// 源文件位於:ext/standard/file.c
# 函數定義

PHP_FUNCTION(readfile)
{
  char *filename;
  size_t filename_len;
  size_t size = 0;
  zend_bool use_include_path = 0;
  zval *zcontext = NULL;
  php_stream *stream;
  php_stream_context *context = NULL;

  ZEND_PARSE_PARAMETERS_START(1, 3)
    Z_PARAM_PATH(filename, filename_len)
    Z_PARAM_OPTIONAL
    Z_PARAM_BOOL(use_include_path)
    Z_PARAM_RESOURCE_OR_NULL(zcontext)
  ZEND_PARSE_PARAMETERS_END();

  context = php_stream_context_from_zval(zcontext, 0);

  stream = php_stream_open_wrapper_ex(filename, "rb", (use_include_path ? USE_PATH : 0) | REPORT_ERRORS, NULL, context);
  if (stream) {
    size = php_stream_passthru(stream);
    php_stream_close(stream);
    RETURN_LONG(size);
  }

  RETURN_FALSE;
}

參數

  • checkfilename - 要讀取的文件名。
  • checkuse_include_path - 想要在 include_path 中搜索文件。可選參數,默認為 false。

返回值

  • checkint - 成功時返回從文件中讀入的字節數。錯誤時返回 false。

示例1: - 使用 readfile() 函數輸出文件。

<?php
/**
 * PHP readfile() 函數輸出文件。
 *
 * @since Version 1.0.0
 * @filesource
 */

// 按二進制輸出 gif 文件
$filename = 'nick.gif';

// 判斷文件是否存在
if(file_exists($filename)) {
  // 設置 Header
  header('Content-Description: File Transfer');
  header('Content-Type: application/octet-stream');
  header('Content-Disposition: attachment; filename="'.basename($filename).'"');
  header('Expires: 0');
  header('Cache-Control: must-revalidate');
  header('Pragma: public');
  header('Content-Length: ' . filesize($filename));
  readfile($filename);
  exit;  
}
rss_feed