PHP -上传照片时更改文件名目的地


PHP - Changing the file name destination when uploading photos

我正在开发一个用户可以上传照片的web应用程序。

我已经有一个PHP代码,我可以将照片上传到服务器目录中的一个文件夹。但是,我的代码的主要问题是,它保留了照片上传之前和上传之后的原始文件名。我的问题是,当有两个不同的照片具有相同的文件名,我有冲突,当他们被上传。

下面是我的代码:
<?php
error_reporting(-1);
ini_set('display_errors', 'On');

require_once '_common.php';
$config = require_once '_config.php';
$fileName = '';
$mimeType = '';
$fileSize = 0;
if (empty($_FILES)) {
    _error('No file received');
}
$pathArray = array();
foreach ($_FILES as $fileName => $fileData) {
    if (!isset($fileData['error']) ||
        is_array($fileData['error'])) {
        die(json_encode(array(
            'success' => false,
            'status' => "Invalid Parameters.",
            'files' => $_FILES 
        )));
    }
    switch ($fileData['error']) {
        case UPLOAD_ERR_OK:
            break;
        case UPLOAD_ERR_NO_FILE:
            die(json_encode(array(
                'success' => false,
                'status' => "No file sent.",
                'files' => $_FILES)));
        case UPLOAD_ERR_INI_SIZE:
        case UPLOAD_ERR_FORM_SIZE:
            die(json_encode(array(
                'success' => false,
                'status' => "Exceeded filesize limit.",
                'files' => $_FILES)));
        default:
            die(json_encode(array(
                'success' => false,
                'status' => "Unknown errors.",
                'files' => $_FILES)));
    }
    // You should also check filesize here. 
    if ($fileData['size'] > 1000000) {
            die(json_encode(array(
                'success' => false,
                'status' => "Exceeded File Size Limit.",
                'files' => $_FILES)));
    }
    $finfo = new finfo(FILEINFO_MIME_TYPE); 
    if (false === $ext = array_search(
        $finfo->file($fileData['tmp_name']),
        array(
            'jpg' => 'image/jpeg',
            'png' => 'image/png',
            'gif' => 'image/gif',), 
        true)) {
        die(json_encode(array(
            'success' => false,
            'status' => "Invalid file format.",
            'files' => $_FILES)));
    }
    if (!move_uploaded_file(
        $fileData['tmp_name'],
        sprintf('./gallery/%s',
        basename($fileData['name'])) )) {
        die(json_encode(array(
            'success' => false,
            'status' => "Failed to move uploaded file.",
            'files' => $_FILES)));
    }
    $uploaddir = '/gallery/';
    $name = $fileData["tmp_name"];
    $fullPath = sprintf('gallery/%s.%s',
        basename($fileData['tmp_name']),
        $ext
    array_push($pathArray, $fullPath);
}
print_r(json_encode(array(
    'success' => true,
    'status' => "File is uploaded successfully.",
    'filePath' => "$fullPath"
)));
?>

我已经失去了对PHP的触觉,然而,这是我所尝试的:

if (!move_uploaded_file(
    $fileData['tmp_name'],
    sprintf('gallery/%s.%s',
    sha1_file($_FILES['fileToUpload']['tmp_name'],
    $ext) 
    )) {
    die(json_encode(array(
        'success' => false,
        'status' => "Failed to move uploaded file.",
        'files' => $_FILES)));
}

应该通过,我改变了$fullPath以适应我想要的新目的地:

$fullPath = sprintf('gallery/%s.%s',
    sha1_file($_FILES['fileToUpload']['tmp_name'],
    $ext);

然而,这些似乎都不起作用。

我的目标是给上传的文件一个或多或少唯一的文件名,然而,我似乎不能使sha1_file工作。

我想知道sha1_file是否可以工作,或者可能有另一种方法来改变目标文件名,这样我就会得到一个唯一的文件名(例如使用日期和时间)。

您可以使用microtime()或uniqid()函数来连接您的文件名:

if (!move_uploaded_file(
    $fileData['tmp_name'],
    sprintf('gallery/%s.%s',
    uniqid() . '_' . $_FILES['fileToUpload']['tmp_name'],
    $ext) 
    )) {
    die(json_encode(array(
        'success' => false,
        'status' => "Failed to move uploaded file.",
        'files' => $_FILES)));
}

关于uniqid的更多信息,请参阅uniqid文档。