所以我正在建立一个具有图像上传功能的网站,并将图像名称存储到数据库中。我拍了我的mac的截图,想上传这张照片“Screen shot 2011-02-18 at 6.52.20 PM.png”。那么,这不是一个存储在mysql中的好名字!人们如何通过这样的方式重命名照片,使每张上传的照片都有一个独特的名称?另外,在重命名照片时,我将如何确保最后保留文件扩展名。
答案 0 :(得分:5)
我会删除扩展名,否则Apache(或等效的)会在请求时运行a1e99398da6cf1faa3f9a196382f1fadc7bb32fb7.php
(可能包含恶意PHP)。我也会把它上传到docroot上面。
如果您需要在docroot上方访问图像,则可以存储通过图像函数运行的安全副本,或者通过header('Content-Type: image/jpeg')
和readfile()
和include
(< strong> not pathinfo($path, PATHINFO_EXTENSION)
因为我可以将PHP嵌入到GIF文件中。
此外,function getUniqueName($originalFilename) {
return sha1(microtime() . $_SERVER['REMOTE_ADDR'] . $originalFilename);
}
是获得扩展程序的最佳方式。
确保您已在数据库中存储了对此文件的引用,其中包含原始文件名和其他元数据。
basename($_FILES['upload']['tmp_name'])
这可以产生重复的唯一方法是,一个具有相同IP的用户在一微秒内多次上传相同的文件名。
或者,您可以使用PHP在上传图片时指定的{{1}}。我会说它应该是独一无二的。
答案 1 :(得分:0)
散列图像名称。可以是md5,sha1甚至是unix时间戳。
这是一个带有随机数(10到99)
的(未经测试的)示例<?php
function generate_unique_name($file_name)
{
$splitted = split(".", $file_name);
return time() . rand(10,99) . "." . $splitted[count($splitted)-1];
}
?>
答案 2 :(得分:0)
您可以使用如下图像表:
id: int
filename: varchar
hash: varchar
format: enum('jpeg', 'png')
哈希可以是sha1_file($uploaded_file)
,用于确保不上传重复的图像。 (因此,如果您愿意,可以在图像表中使用相同的哈希值设置多个条目。)id非常有用,因此您可以将整数外键链接返回到图像表。
接下来将图像存储在:
中/image/$id.$format
或
/image/$hash.$format
通过散列的第二种格式将确保您不会复制图像数据。如果您正在处理大量图像,您可能需要执行以下操作:
/image/a/b/c/abcdef12345.jpg
您可以使用多层文件夹来存储图像。许多文件系统因单个目录中的文件太多而变慢。
现在您可以直接链接到这些文件,或者设置如下的URL:
/image/$id/$filename
例如:
/image/12347/foo.jpg
foo.jpg
来自用户上传的内容。它实际上被忽略了,因为你通过id查找。但是,如果用户选择下载图像,它会使图像名称很好。 (您可以选择在查找ID后验证图像文件名是否匹配。)
上述路径可以通过Apache的MultiView或ModRewrite转换为image.php。然后你可以readfile()
或使用X-SendFile(更好的性能,但不总是可用)将文件发送给用户。
请注意,如果您没有X-SendFile并且不想通过PHP处理事物,则可以使用RewriteRule将/image/$hash/foo.jpg
转换为/image/a/b/c/$hash.jpg
。