我正在开发一个用户可以上传照片的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文档。