如何使用FPDF将唯一文件名保存到目录?

时间:2017-12-27 00:48:49

标签: php fpdf

在使用FPDF库生成PDF之后,我想将每个新生成的PDF文件保存到“receipts”目录中...就像现在一样,每次都会覆盖PDF。我可以在PDF文件名中附加时间戳吗?示例--->(/receipt_month-day-year-hour-seconds.pdf)

所需的绝对唯一性,但不是超级关键。

$pdf->Output('receipts/receipt.pdf', 'F');

1 个答案:

答案 0 :(得分:1)

确保文件名唯一的一种简单(但不是万无一失)的方法是在文件名中添加一个微量时间戳。 Microtime包括一秒钟的thousanths,所以除非你的网站有很多流量,否则可能会有效:

$pdf->Output('receipts/receipt-' . microtime(true) . '.pdf', 'F');

如果您希望时间戳与receipt_12-26-2017.pdf相同,那么:

$pdf->Output('receipts/receipt_' . date("m-d-Y") . '.pdf', 'F');

如果你真的想确保每个目录的文件名是唯一的,你可以这样做:

<?php

function get_filenames($source_dir, $include_path = FALSE, $_recursion = FALSE)
{
    static $_filedata = array();

    if ($fp = @opendir($source_dir))
    {
        // reset the array and make sure $source_dir has a trailing slash on the initial call
        if ($_recursion === FALSE)
        {
            $_filedata = array();
            $source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
        }

        while (FALSE !== ($file = readdir($fp)))
        {
            if (@is_dir($source_dir.$file) && strncmp($file, '.', 1) !== 0)
            {
                get_filenames($source_dir.$file.DIRECTORY_SEPARATOR, $include_path, TRUE);
            }
            elseif (strncmp($file, '.', 1) !== 0)
            {
                $_filedata[] = ($include_path == TRUE) ? $source_dir.$file : $file;
            }
        }
        return $_filedata;
    }
    else
    {
        return FALSE;
    }
}

function force_unique_filename( $dir_list, $file_name, $x = 2 )
{
    /**
     * Dir list may be an array of file names, or in the case of 
     * cURL, the list may be supplied as a string. If an array, we 
     * just convert the array to a string so it is checked as a string.
     */
    if( is_array( $dir_list ) )
    {
        $dir_list = implode( ' ', $dir_list );
    }

    while( strpos( $dir_list, $file_name ) !== FALSE )
    {
        // Use pathinfo to break apart the filename
        $info = pathinfo( $file_name );

        // Get the file extension of the file
        $ext = '.' . $info['extension'];

        // Get the name of the file without extension
        $file_name = basename( $file_name, $ext );

        // Remove the filename suffix before adding a new one
        $pattern = '/\(\d+\)/';
        $replacement = '';
        $file_name = preg_replace( $pattern, $replacement, $file_name );

        // Add new filename suffix
        $file_name .= '(' . (string) $x . ')' . $ext;

        // Increment the number we are using in a filename suffix "($x)"
        $x++;
    }

    return $file_name;
}

// -----------------------------------------------------------------------

// This directory should be an absolute path...
$source_dir = './receipts';

// The desired filename
$filename = 'receipt_' . date("m-d-Y") . '.pdf';

// Get all of the filenames in this directory
$filenames = get_filenames( $source_dir, FALSE, FALSE );

// Get the unique filename
$unique_filename = force_unique_filename( $filenames, $filename );

$pdf->Output('receipts/' . $unique_filename, 'F');