因此,我制作了一个具有图像上传功能的网站,并将图像名称存储到数据库中。我给我的苹果电脑拍了一张屏幕截图,想上传这张照片“screenshot 2011-02-18 at 6.52.20 PM.png”。嗯,这不是一个好名字存储在mysql中!人们通常如何重命名照片,使上传的每张照片都有一个唯一的名称?另外,在重命名照片时,我如何确保最后保留文件扩展名。
发布于 2011-03-23 09:28:43
我会放弃这个扩展,否则Apache (或类似的)将在请求时运行a1e99398da6cf1faa3f9a196382f1fadc7bb32fb7.php
(可能包含恶意PHP)。我也会把它上传到文档根目录的上面。
如果你需要使图片在文档根目录之上可访问,你可以存储一个通过图片函数运行的安全副本,或者使用header('Content-Type: image/jpeg')
和readfile()
(而不是 include
,因为我可以在GIF文件中嵌入PHP )从一些PHP提供服务。
此外,pathinfo($path, PATHINFO_EXTENSION)
是获得扩展的最佳方式。
确保您已在数据库中存储了对此文件的引用以及原始文件名和其他元数据。
function getUniqueName($originalFilename) {
return sha1(microtime() . $_SERVER['REMOTE_ADDR'] . $originalFilename);
}
这可能会产生重复的唯一方法是,如果具有相同IP的用户在一微秒内多次上载相同的文件名。
或者,您可以只使用PHP在上传图像时分配的basename($_FILES['upload']['tmp_name'])
。我会说它应该是独一无二的。
发布于 2011-03-23 09:10:17
对映像名称进行哈希处理。可以是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];
}
?>
发布于 2011-03-23 10:00:55
您可以使用如下所示的映像表:
id: int
filename: varchar
hash: varchar
format: enum('jpeg', 'png')
散列可以类似于sha1_file($uploaded_file)
,用于确保不会上传重复的图像。(因此,如果需要,映像表中可以有多个具有相同散列的条目。)id很有用,因此您可以拥有指向image表的整型外键链接。
下一步,将图像存储在以下任一位置:
/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
。
https://stackoverflow.com/questions/5399760
复制相似问题