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

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

在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/

你可能感兴趣的文章
NOIP2014 提高组 Day2——寻找道路
查看>>
noip借教室 题解
查看>>
NOIP模拟测试19
查看>>
NOIp模拟赛二十九
查看>>
Vue3+element plus+sortablejs实现table列表拖拽
查看>>
Nokia5233手机和我装的几个symbian V5手机软件
查看>>
non linear processor
查看>>
Non-final field ‘code‘ in enum StateEnum‘
查看>>
none 和 host 网络的适用场景 - 每天5分钟玩转 Docker 容器技术(31)
查看>>
None还可以是函数定义可选参数的一个默认值,设置成默认值时实参在调用该函数时可以不输入与None绑定的元素...
查看>>
NoNodeAvailableException None of the configured nodes are available异常
查看>>
Vue.js 学习总结(16)—— 为什么 :deep、/deep/、>>> 样式能穿透到子组件
查看>>
nopcommerce商城系统--文档整理
查看>>
NOPI读取Excel
查看>>
NoSQL&MongoDB
查看>>
NoSQL介绍
查看>>
NoSQL数据库概述
查看>>
Notadd —— 基于 nest.js 的微服务开发框架
查看>>
NOTE:rfc5766-turn-server
查看>>
Notepad ++ 安装与配置教程(非常详细)从零基础入门到精通,看完这一篇就够了
查看>>