0

0

Laravel 中防止上传同名文件

霞舞

霞舞

发布时间:2025-10-17 10:47:01

|

752人浏览过

|

来源于php中文网

原创

laravel 中防止上传同名文件

本文旨在帮助 Laravel 开发者解决在多文件上传时,因文件名重复导致程序崩溃的问题。通过在文件名生成过程中引入自增变量,确保即使在同一时刻上传相同名称的文件,也能避免冲突,保证上传过程的顺利进行。本文将提供详细的代码示例和注意事项,帮助你轻松解决这个问题。

在 Laravel 应用中,处理文件上传是一个常见的需求。然而,当用户尝试同时上传多个同名文件时,可能会引发问题,导致程序崩溃。这是因为默认情况下,如果使用相同的文件名保存文件,后续上传的文件会覆盖之前的文件,在高并发场景下,容易出现数据丢失或者程序异常。本文将介绍一种简单有效的解决方案,通过在文件名中加入时间戳和自增变量,确保每个上传的文件都有唯一的文件名。

解决方案:生成唯一文件名

核心思路是在生成文件名时,结合当前时间戳和一个自增变量,确保即使在极短的时间内上传多个同名文件,也能得到不同的文件名。

以下是一个修改后的 listingSave 方法示例:

启科PHP淘宝客系统
启科PHP淘宝客系统

1、请上传下载到的淘宝客系统安装包并上传到空间根目录中进行解压,解压后将网站文件移动到根目录的位置,然后访问 /install 进行安装。您也可以在本地解压,并以二进制方式将程序上传至您的网站空间。 2、同意启科网络电子商务系统安装协议进入下一步。 3、如果系统检测环境通过,则会提示输入您的数据库服务器地址(一般为本机,即127.0.0.1或者localhost)、数据库账号、数据库密码、数据库名

下载
public function listingSave(Request $request) {
   if($request->hasFile('files')){

        $files = $request->file('files');
        $i = 0;

        foreach ($files as $file) {
            $originalName = $file->getClientOriginalName();
            $extension = $file->getClientOriginalExtension();
            $image_name = date('mdYhis').'_'.$i.'_'.$originalName;

            // 将文件存储到 public/images 目录下
            $file->move(public_path('images'), $image_name);

            // 或者使用 Storage facade
            // Storage::disk('public')->put('images/'.$image_name, file_get_contents($file));

            // 保存文件信息到数据库
            $fileModel = new FileModel();
            $fileModel->name = $image_name;
            $fileModel->sort_order = $i; // 或者其他逻辑
            $fileModel->created_at = now();
            $fileModel->updated_at = now();
            $fileModel->created_by_id = 0; // 或者 Auth::user()->id
            $fileModel->disk_id = 1;
            $fileModel->folder_id = 1;
            $fileModel->extension = $extension;
            $fileModel->size = $file->getSize();
            $fileModel->mime_type = $file->getMimeType();
            $fileModel->entry_type = "Anomaly\Streams\Platform\Model\Files\FilesImagesEntryModel";
            // 获取图片尺寸
            list($width, $height) = getimagesize(public_path('images/'.$image_name));
            $fileModel->height = $height;
            $fileModel->width = $width;
            $fileModel->save();

            // 关联到 truckian_products_image 表
            DB::table('truckian_products_image')->insert(['entry_id'=>$p_id,'file_id'=>$fileModel->id,'sort_order'=>$i+1]);

            $i++;
        }

        foreach($available as $key => $value)
            DB::insert('insert into default_truckian_mileage_gap(mileage_gap,number_of_products,truck_id)values (?,  ?, ?)',[$key,$value,$p_id]);
    }
}

代码解释:

  1. $i = 0;: 初始化一个自增变量 $i,用于区分同一时刻上传的文件。
  2. $files = $request->file('files');: 获取上传的文件数组,确保files存在。
  3. foreach ($files as $file): 遍历上传的每个文件。
  4. $originalName = $file->getClientOriginalName();: 获取原始文件名。
  5. $extension = $file->getClientOriginalExtension();: 获取文件扩展名。
  6. $image_name = date('mdYhis').'_'.$i.'_'.$originalName;: 生成新的文件名,包括时间戳、自增变量和原始文件名。
  7. $file->move(public_path('images'), $image_name);: 将文件移动到指定的目录。 注意替换成自己的存储路径。
  8. 文件信息保存: 将文件信息保存到数据库中。
  9. $i++;: 在每次循环结束时,递增 $i 的值。

注意事项:

  • $request->hasFile('files'): 确保请求中包含名为 'files' 的文件上传。
  • 存储路径: 根据实际情况修改文件存储路径,例如 public_path('images')。
  • 数据库字段: 确保数据库表结构包含存储文件名的字段。
  • 错误处理: 建议添加错误处理机制,例如使用 try-catch 块捕获文件上传过程中可能出现的异常。
  • 安全性: 始终验证上传的文件类型和大小,防止恶意文件上传。

总结

通过在文件名生成过程中引入时间戳和自增变量,可以有效地避免 Laravel 应用中多文件上传时文件名冲突的问题。在实际开发中,可以根据具体需求调整文件名生成的策略,例如使用 UUID 等更复杂的方式生成唯一文件名。同时,需要注意文件上传的安全性,防止恶意攻击。

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

319

2024.04.09

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

276

2024.04.09

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

370

2024.04.09

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

371

2024.04.10

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

81

2025.08.05

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

64

2025.08.05

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

67

2025.08.05

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

47

2025.12.04

html编辑相关教程合集
html编辑相关教程合集

本专题整合了html编辑相关教程合集,阅读专题下面的文章了解更多详细内容。

37

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Laravel---API接口
Laravel---API接口

共7课时 | 0.6万人学习

PHP自制框架
PHP自制框架

共8课时 | 0.6万人学习

PHP面向对象基础课程(更新中)
PHP面向对象基础课程(更新中)

共12课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号