什么是#34;传统"处理上传图片名称的方式?

时间:2011-03-23 01:07:12

标签: php mysql image-processing

所以我正在建立一个具有图像上传功能的网站,并将图像名称存储到数据库中。我拍了我的mac的截图,想上传这张照片“Screen shot 2011-02-18 at 6.52.20 PM.png”。那么,这不是一个存储在mysql中的好名字!人们如何通过这样的方式重命名照片,使每张上传的照片都有一个独特的名称?另外,在重命名照片时,我将如何确保最后保留文件扩展名。

3 个答案:

答案 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