首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理上传的图像名称的“常规”方式是什么?

处理上传的图像名称的“常规”方式是什么?
EN

Stack Overflow用户
提问于 2011-03-23 09:07:12
回答 3查看 770关注 0票数 1

因此,我制作了一个具有图像上传功能的网站,并将图像名称存储到数据库中。我给我的苹果电脑拍了一张屏幕截图,想上传这张照片“screenshot 2011-02-18 at 6.52.20 PM.png”。嗯,这不是一个好名字存储在mysql中!人们通常如何重命名照片,使上传的每张照片都有一个唯一的名称?另外,在重命名照片时,我如何确保最后保留文件扩展名。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-23 09:28:43

我会放弃这个扩展,否则Apache (或类似的)将在请求时运行a1e99398da6cf1faa3f9a196382f1fadc7bb32fb7.php (可能包含恶意PHP)。我也会把它上传到文档根目录的上面。

如果你需要使图片在文档根目录之上可访问,你可以存储一个通过图片函数运行的安全副本,或者使用header('Content-Type: image/jpeg')readfile() (而不是 include,因为我可以在GIF文件中嵌入PHP )从一些PHP提供服务。

此外,pathinfo($path, PATHINFO_EXTENSION)是获得扩展的最佳方式。

确保您已在数据库中存储了对此文件的引用以及原始文件名和其他元数据。

代码语言:javascript
运行
复制
function getUniqueName($originalFilename) {
    return sha1(microtime() . $_SERVER['REMOTE_ADDR'] . $originalFilename);
}

这可能会产生重复的唯一方法是,如果具有相同IP的用户在一微秒内多次上载相同的文件名。

或者,您可以只使用PHP在上传图像时分配的basename($_FILES['upload']['tmp_name'])。我会说它应该是独一无二的。

票数 5
EN

Stack Overflow用户

发布于 2011-03-23 09:10:17

对映像名称进行哈希处理。可以是md5、sha1,甚至是unix时间戳。

下面是一个随机数(10到99)的(未经测试的)示例

代码语言:javascript
运行
复制
<?php
function generate_unique_name($file_name)
{
    $splitted = split(".", $file_name);
    return time() . rand(10,99) . "." . $splitted[count($splitted)-1];
}
?>
票数 0
EN

Stack Overflow用户

发布于 2011-03-23 10:00:55

您可以使用如下所示的映像表:

代码语言:javascript
运行
复制
id: int
filename: varchar 
hash: varchar
format: enum('jpeg', 'png')

散列可以类似于sha1_file($uploaded_file),用于确保不会上传重复的图像。(因此,如果需要,映像表中可以有多个具有相同散列的条目。)id很有用,因此您可以拥有指向image表的整型外键链接。

下一步,将图像存储在以下任一位置:

代码语言:javascript
运行
复制
/image/$id.$format

代码语言:javascript
运行
复制
/image/$hash.$format

通过散列的第二种格式将确保您不会复制图像数据。如果您正在处理大量图像,您可能希望执行以下操作:

代码语言:javascript
运行
复制
/image/a/b/c/abcdef12345.jpg

您可以使用多层文件夹来存储图像。当单个目录中有太多文件时,许多文件系统会变慢。

现在,您可以直接链接到这些文件,或者设置URL,如下所示:

代码语言:javascript
运行
复制
/image/$id/$filename

例如:

代码语言:javascript
运行
复制
/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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5399760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档