0

我的 Dedi 服务器上有一个 PHP 上传器,上传器可以正常工作,只有在上传文件后,它才不会从它们的临时名称重命名它们。

结果是这样的

2b4134a1f559b6da866c9febbc92d709.mp3

上传文件.php

    <?php

class file {

    public $id;
    public $fileName;
    public $systemFilename;
    public $fileType;
    public $fileExtension;
    public $systemUrl;
    public $originalUrl;
    public $thumbPath;
    public $thumbUrl;
    public $canHaveThumb;
    public $ts;
    public $size;
    public $authorized;
    public $knownExtensions;
    public $mimeType;
    public $filePath;

    public function __construct() {
        $this->setKnownExtensions();
    }

    // Check and save a new file on the disk and the database
    public function uploadNewFile($files) {

        $result = array(); // The variable we will send back when we have finished to check and save the file
        $this->setFileName($files['Filedata']['name']);
        if ($this->authorized) {

            // Build the target path
            $siteUrl = F3::get('siteUrl'); // Set in config.php
            $uploadFolder = F3::get('uploadFolder'); // Set in config.php
            $uploadUrl = $_SERVER['DOCUMENT_ROOT'] . '/' . $uploadFolder . '/';

            // Get the temporary file
            $tempFile = $_FILES['Filedata']['tmp_name'];

            // Get a unique system name
            $rand = rand(1, 414342);
            $ts = time();
            $systemName = md5($rand . $ts);

            $this->systemFilename = $systemName . '.' . $this->fileExtension;
            $this->ts = $ts;

            // Clean the path
            $targetFile = str_replace('//', '/', $uploadUrl) . $this->systemFilename;
            // Save the file on the disk
            move_uploaded_file($tempFile, $targetFile);

            // Save the file in the database
            DB::sql('INSERT INTO hm_files (fileName, systemFilename, fileType, time) VALUES ("' . $this->fileName . '", "' . $this->systemFilename . '", "' . $this->fileType . '", ' . $this->ts . ')');
            $this->id = F3::get('DB->pdo')->lastInsertId();

            // Retrieve the template for the file list
            $result['tableRow'] = $this->getTableRow();

            // We create a thumbnail if it is a simple image
            $this->createThumb();
        }

        $result['file'] = $this;
        return $result;
    }

    public function canHaveThumb() {
        if ($this->fileType == 'image') {

            $this->canHaveThumb = true;
        } else {
            $this->canHaveThumb = false;
        }
        return $this->canHaveThumb;
    }

    public function createThumb() {
        if ($this->canHaveThumb()) {
            $filePath = $this->getFilePath();
            if (file_exists($filePath)) {
                $thumbPath = site::getThumbsPath();
                $thumb = new image($filePath);
                $thumb->dir($thumbPath);
                $thumb->width(250);
                $thumb->save();
            }
        }
    }

    public function getThumbPath() {
        $thumbFolderPath = site::getThumbsPath();
        $this->thumbPath = $thumbFolderPath . $this->systemFilename;

        if (!file_exists($this->thumbPath)) {
            $this->createThumb();
        }

        return $this->thumbPath;
    }

    public function getThumbUrl() {

        $base = F3::get('BASE');
        $thumbsFolder = F3::get('thumbsFolder');
        $this->thumbUrl = $base . '/' . $thumbsFolder . '/' . $this->systemFilename;

        return $this->thumbUrl;
    }

    // Delete a file
    public function delete() {
        $filePath = $this->getFilePath();
        if (file_exists($filePath)) {
            unlink($filePath); // Remove the file from the hard drive
        }
        if ($this->canHaveThumb()) {
            $thumbPath = $this->getThumbPath();
            if (file_exists($thumbPath)) {

                unlink($thumbPath); // Remove the thumb from the hard drive
            }
        }
        DB::sql('DELETE FROM hm_files WHERE id = ' . $this->id); // Remove from database
    }

    // Set the filename and the file extension
    public function setFileName($fileName) {
        $this->fileName = $fileName;
        $this->fileExtension = strtolower(substr(strrchr($this->fileName, '.'), 1));
        $this->checkExtension();
        $this->getFileType();
    }

    // Check if a file has an authorized extension
    public function checkExtension() {
        $okExtensions = F3::get('okExtensions'); // defined in config.php
        if (in_array($this->fileExtension, $okExtensions)) {
            $this->authorized = true;
        } else {
            $this->authorized = false;
        }
        return $this->authorized;
    }

    // Define the file type (eg: image, video, ...)
    // Not used in this version
    public function getFileType() {
        $ext = $this->fileExtension;
        if (isset($this->knownExtensions[$ext])) {
            $this->fileType = $this->knownExtensions[$ext];
        } else {
            $this->fileType = 'file';
        }
        return $this->fileType;
    }

    public function getFileSize() {
        $this->size = filesize($this->getFilePath());
        return $this->size;
    }

    // Transform the filesize in kilobytes, megabytes, ... and append the unit.
    public function getReadableSize() {
        $bytes = $this->getFileSize();
        $decimals = 2;
        $sz = 'BKMGTP';
        $factor = floor((strlen($bytes) - 1) / 3);
        return sprintf("%.{$decimals}f", $bytes / pow(1024, $factor)) . @$sz[$factor];
    }

    // Get the HTML for the file list
    public function getTableRow() {

        F3::set('file', $this);
        // We check if the file exist before displaying the table row
        if (file_exists($this->getFilePath())) {
            $tableRow = F3::render('views/table_row.php');
            return $tableRow;
        } else {
            return '';
        }
    }

    // Get a file path on the server harddrive
    public function getFilePath() {
        $path = F3::get('rootPath');
        $uploadsFolder = F3::get('uploadFolder');
        $this->filePath = $path . '/' . $uploadsFolder . '/' . $this->systemFilename;
        return $this->filePath;
    }

    public function getSystemUrl() {
        $base = F3::get('BASE');
        $this->systemUrl = $base . '/file/' . $this->systemFilename;
        return $this->systemUrl;
    }

    public function getOriginalUrl() {
        $siteUrl = F3::get('siteUrl');
        $uploadsFolder = F3::get('uploadFolder');

        $this->originalUrl = $siteUrl . '/' . $uploadsFolder . '/' . $this->systemFilename;
        return $this->originalUrl;
    }

    public function getMime() {
        $filePath = $this->getFilePath();
        $finfo = new finfo(FILEINFO_MIME);
        $info = $finfo->file($filePath);
        return $info;
    }

    public function gearUp($queryResult) {
        $this->id = $queryResult['id'];
        $this->fileName = $queryResult['fileName'];
        $this->systemFilename = $queryResult['systemFilename'];
        $this->fileType = $queryResult['fileType'];
        $this->ts = $queryResult['time'];
        $this->getSystemUrl();
        $this->getOriginalUrl();
        return $this;
    }

    // Display a single file
    public static function display($systemFilename) {
        $fileQuery = DB::sql('SELECT * FROM hm_files WHERE systemFilename LIKE "' . $systemFilename . '"');
        if (count($fileQuery) > 0) {
            $file = new file();
            $file->gearUp($fileQuery[0]);
            $mime = $file->getMime();
            header('Content-Disposition: inline; filename="' . $file->fileName . '"');
            header('Content-type: ' . $mime);
            readfile($file->getOriginalUrl());
        } else {
            return false;
        }
    }

    // Build a zip of files
    // You can create direct download by setting $directDownload on true.
    // Important : we don't use the classic ZipArchive class of PHP. When we zip large files it produces errors.
    // We use the pclzip class. Doc: http://www.phpconcept.net/pclzip/
    public static function serveZip($idsArray, $token, $directDownload = true) {
        if (count($idsArray) > 0) {
            $rootPath = F3::get('rootPath');
            $zipPath = $rootPath . '/zips/archive-' . $token . '.zip';
            $zipper = new pclzip($zipPath);

            foreach ($idsArray as $id) {
                $file = file::fetch($id);
                $filePath = $file->getFilePath();
                $filesArray = array(
                    array(PCLZIP_ATT_FILE_NAME => $filePath,
                        PCLZIP_ATT_FILE_NEW_FULL_NAME => $file->fileName)
                );
                $zipper->add($filesArray, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_REMOVE_ALL_PATH);
            }


            // We set the cookie to track the end of zipping
            setcookie('multiUp', $token);

            // If this is a direct download we serve the zip in the browser and then destroy the zipfile on the server
            if ($directDownload) {
                $zipContent = file_get_contents($zipPath);
                header('Content-Disposition: attachment; filename="archive.zip"');
                header('Content-type: application/zip');
                echo $zipContent;
                unlink($zipPath);
            }
        }
    }

    // Get info for a single file
    public static function fetch($id) {
        $fileQuery = DB::sql('SELECT * FROM hm_files WHERE id = ' . $id);
        if (count($fileQuery) > 0) {
            $file = new file();
            $file->gearUp($fileQuery[0]);

            return $file;
        } else {
            return false;
        }
    }

    // Fetch all files in the database
    public static function fetchAll() {
        $files = array();
        $filesId = DB::sql('SELECT id FROM hm_files ORDER BY time DESC');
        foreach ($filesId as $fileId) {
            $file = file::fetch($fileId['id']);
            if ($file) {
                $files[] = $file;
            }
        }
        return $files;
    }

    // Creates families for file extensions
    // Not used in this version. Might be usefull to create icons
    private function setKnownExtensions() {
        $fileTypes = array();

        // DOCUMENTS
        $fileTypes['pdf'] = 'pdf';

        // PLAIN TEXT
        $fileTypes['txt'] = 'text';
        $fileTypes['rtf'] = 'text';
        $fileTypes['as'] = 'text';
        $fileTypes['xml'] = 'text';
        $fileTypes['html'] = 'text';
        $fileTypes['htm'] = 'text';
        $fileTypes['js'] = 'text';
        $fileTypes['php'] = 'text';
        $fileTypes['asp'] = 'text';
        $fileTypes['py'] = 'text';
        $fileTypes['sql'] = 'text';
        $fileTypes['css'] = 'text';

        // ARCHIVES
        $fileTypes['zip'] = 'archive';
        $fileTypes['rar'] = 'archive';
        $fileTypes['7zip'] = 'archive';
        $fileTypes['gzip'] = 'archive';
        $fileTypes['gz'] = 'archive';
        $fileTypes['tgz'] = 'archive';
        $fileTypes['ace'] = 'archive';
        $fileTypes['arc'] = 'archive';

        // EXCEL
        $fileTypes['xls'] = 'excel';
        $fileTypes['xlsx'] = 'excel';
        $fileTypes['xlsm'] = 'excel';
        $fileTypes['ods'] = 'excel';
        $fileTypes['ots'] = 'excel';
        $fileTypes['csv'] = 'excel';
        $fileTypes['numbers'] = 'excel';

        // WORD
        $fileTypes['doc'] = 'word';
        $fileTypes['docx'] = 'word';
        $fileTypes['odt'] = 'word';
        $fileTypes['ott'] = 'word';
        $fileTypes['pages'] = 'word';

        // POWERPOINT
        $fileTypes['ppt'] = 'powerpoint';
        $fileTypes['pptx'] = 'powerpoint';
        $fileTypes['odp'] = 'powerpoint';
        $fileTypes['otp'] = 'powerpoint';
        $fileTypes['key'] = 'powerpoint';

        // IMAGES
        $fileTypes['png'] = 'image';

        $fileTypes['gif'] = 'image';
        $fileTypes['jpg'] = 'image';
        $fileTypes['jpeg'] = 'image';


        // UNCOMMON IMAGEs
        $fileTypes['svg'] = 'rareimage';
        $fileTypes['svgz'] = 'rareimage';
        $fileTypes['jpf'] = 'rareimage';
        $fileTypes['bmp'] = 'rareimage';
        $fileTypes['eps'] = 'rareimage';
        $fileTypes['tif'] = 'rareimage';
        $fileTypes['tiff'] = 'rareimage';
        $fileTypes['raw'] = 'rareimage';
        $fileTypes['pbm'] = 'rareimage';
        $fileTypes['tga'] = 'rareimage';
        $fileTypes['cdr'] = 'rareimage';



        // "WORKING" IMAGES
        $fileTypes['psd'] = 'photoshop';
        $fileTypes['psb'] = 'photoshop';

        $fileTypes['ai'] = 'illustrator';
        $fileTypes['ait'] = 'illustrator';
        $fileTypes['fxg'] = 'illustrator';
        $fileTypes['cgm'] = 'illustrator';

        $fileTypes['indd'] = 'indesign';
        $fileTypes['idml'] = 'indesign';

        $fileTypes['fla'] = 'flash';
        $fileTypes['swf'] = 'flash';
        $fileTypes['xfl'] = 'flash';

        $fileTypes['prproj'] = 'premiere';

        $fileTypes['aep'] = 'aftereffect';

        // 3D
        $fileTypes['3ds'] = '3d';
        $fileTypes['dwg'] = '3d';
        $fileTypes['dxf'] = '3d';
        $fileTypes['max'] = '3d';

        // SOUND / MUSIC
        $fileTypes['mp3'] = 'music';
        $fileTypes['wav'] = 'music';
        $fileTypes['flac'] = 'music';
        $fileTypes['aac'] = 'music';
        $fileTypes['aiff'] = 'music';
        $fileTypes['aif'] = 'music';
        $fileTypes['aifc'] = 'music';
        $fileTypes['wma'] = 'music';
        $fileTypes['au'] = 'music';
        $fileTypes['snd'] = 'music';
        $fileTypes['aa3'] = 'music';
        $fileTypes['oma'] = 'music';
        $fileTypes['at3'] = 'music';
        $fileTypes['m3u'] = 'music';
        $fileTypes['amr'] = 'music';
        $fileTypes['cda'] = 'music';

        //VIDEO
        $fileTypes['avi'] = 'video';
        $fileTypes['flv'] = 'video';
        $fileTypes['m4v'] = 'video';
        $fileTypes['mkv'] = 'video';
        $fileTypes['mov'] = 'video';
        $fileTypes['mpeg'] = 'video';
        $fileTypes['mpg'] = 'video';
        $fileTypes['mpe'] = 'video';
        $fileTypes['mp4'] = 'video';
        $fileTypes['3gp'] = 'video';
        $fileTypes['aep'] = 'video';

        $this->knownExtensions = $fileTypes;
    }

}

?>

它在具有 CPanel 的托管服务器上运行良好,这就是为什么我怀疑我的 PHP.ini 文件?(我自己安装了服务器)

如果是 .ini 文件,我应该寻找什么?

4

1 回答 1

1

该脚本会故意更改文件名,以确保它们始终是唯一的。如果有人上传具有相同文件名的文件,这可以防止文件被覆盖。如果你真的想保留原来的名字,你可以改变这一行:

  $targetFile = str_replace('//', '/', $uploadUrl) . $this->systemFilename;

对此:

$targetFile = str_replace('//', '/', $uploadUrl) . $this->fileName;

请注意,尽管脚本为每个上传的文件分配了唯一的名称,但它仍然在数据库表中保留原始名称,如下所示:

 DB::sql('INSERT INTO hm_files (fileName, systemFilename, fileType, time) VALUES ("' . $this->fileName . '", "' . $this->systemFilename . '", "' . $this->fileType . '", ' . $this->ts . ')');
于 2012-08-22T20:37:34.113 回答