博客
关于我
Thinkphp3.2.3 多图上传,同类型只能上传一张问题
阅读量:374 次
发布时间:2019-03-05

本文共 2135 字,大约阅读时间需要 7 分钟。

在Thinkphp3.2.3版本中,实现多图上传功能时,遇到了一种问题:当尝试一次性上传多张.jpg文件时,系统只保存最后一张文件。经过深入分析,问题的根源在于文件的保存名(saveName)设置上。以下是详细的解决方案和优化方法。

问题背景

在使用Thinkphp框架进行文件上传时,如果在同一类型下尝试一次性上传多张图片文件(如.jpg格式),系统可能会只保存最后一张文件而忽略其他文件。经过多次调试和尝试,发现问题主要出现在文件的唯一性识别机制上。

传统解决方法的局限

在早期的解决方案中,开发者通常会尝试通过设置不同的文件扩展名或使用不同的上传路径来实现多图上传。但由于系统内部的唯一性控制机制,这种方法往往无法有效解决问题。

引入唯一标识符

为了确保每个上传的文件具有唯一性,避免重复存储,我们可以引入唯一标识符(UUID)来为每个文件生成独特的保存名。这种方法不仅能保证文件的唯一性,还能避免同名文件的冲突。

UUID生成方法

App/Common/Common/function.php文件中,可以添加如下代码来生成唯一标识符:

function guid() {
if (function_exists('com_create_guid')) {
return com_create_guid();
} else {
mt_srand((double) microtime() * 10000);
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(45); // 使用下划线替代原有的连接符
$uuid = substr($charid, 0, 8) . $hyphen
. substr($charid, 8, 4) . $hyphen
. substr($charid, 12, 4) . $hyphen
. substr($charid, 16, 4) . $hyphen
. substr($charid, 20, 12);
return $uuid;
}
}

上传方法优化

在文件上传的处理逻辑中,修改saveName的设置方式:

public function upload() {
$upload = new \Think\Upload();
$upload->maxSize = 0;
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');
$upload->rootPath = './Public/upload/';
$upload->savePath = 'thumb/';
$upload->saveName = array('guid', '');
$info = $upload->upload();
if (!$info) {
$this->error($upload->getError());
} else {
$this->success('上传成功!');
}
}

生成的文件路径优化

为了使文件路径更加友好,可以对生成的UUID进行优化处理。例如:

if (function_exists('com_create_guid')) {
return com_create_guid();
} else {
mt_srand((double) microtime() * 10000);
$charid = strtoupper(md5(uniqid(rand(), true)));
$hyphen = chr(95); // 使用下划线替代原有的连接符
$uuid = substr($charid, 0, 8) . $hyphen
. substr($charid, 8, 4) . $hyphen
. substr($charid, 12, 4) . $hyphen
. substr($charid, 16, 4) . $hyphen
. substr($charid, 20, 12);
return $uuid;
}

经过上述优化,生成的文件路径将变为:

C4D414B3_D751_173B_BCD9_F8C8CE95C5F5.jpg

总结

通过在文件上传过程中引入唯一标识符(UUID)为每个文件生成独特的保存名,可以有效避免同名文件的冲突问题。这种方法不仅保证了文件的唯一性,还提高了系统的稳定性和可靠性。在实际应用中,建议根据具体需求对文件命名规则进行调整,以满足更复杂的使用场景。

转载地址:http://qtdwz.baihongyu.com/

你可能感兴趣的文章
Nacos配置中心集群原理及源码分析
查看>>
nacos配置自动刷新源码解析
查看>>
Nacos集群搭建
查看>>
nacos集群搭建
查看>>
Navicat for MySQL 查看BLOB字段内容
查看>>
Neo4j电影关系图Cypher
查看>>
Neo4j的安装与使用
查看>>
Neo4j(2):环境搭建
查看>>
Neo私链
查看>>
nessus快速安装使用指南(非常详细)零基础入门到精通,收藏这一篇就够了
查看>>
Nessus漏洞扫描教程之配置Nessus
查看>>
Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
查看>>
NetApp凭借领先的混合云数据与服务把握数字化转型机遇
查看>>
NetBeans IDE8.0需要JDK1.7及以上版本
查看>>
netcat的端口转发功能的实现
查看>>
netfilter应用场景
查看>>
netlink2.6.32内核实现源码
查看>>
Netpas:不一样的SD-WAN+ 保障网络通讯品质
查看>>
NetScaler的常用配置
查看>>
netsh advfirewall
查看>>