Laravel:使用store()方法上传时自定义文件名的实现方案
如何在Laravel上传文件时设置自定义文件名?
嘿,我来帮你搞定这个问题!在Laravel里,store()方法确实默认会用hashName()生成随机的哈希文件名,如果你想指定自己的文件名,别用store()了,换成storeAs()方法就可以实现你的需求。
storeAs()方法专门用来指定自定义文件名,它的参数很简单:
- 第一个参数:文件要存储的目录(和
store()的第一个参数一致) - 第二个参数:你想要的完整自定义文件名(记得包含文件后缀哦)
- 第三个参数(可选):存储磁盘名称,默认用配置里的
public磁盘的话可以省略
结合你给出的代码,修改后的示例如下:
$uploadfiles = $request->file('file'); foreach ($uploadfiles as $key => $value) { // 这里替换成你想要的自定义文件名,比如你示例里的"May 2, 2018 Report.xlsx" $customFileName = 'May 2, 2018 Report.xlsx'; // 使用storeAs方法实现自定义文件名存储 $file = $value->storeAs('public/fca_files', $customFileName); // 如果你想保留原文件名,同时避免重复覆盖,可以这样写: // 获取原文件名(不含后缀) $originalFileName = pathinfo($value->getClientOriginalName(), PATHINFO_FILENAME); // 获取文件后缀 $fileExt = $value->getClientOriginalExtension(); // 生成带时间戳的自定义文件名,防止重复 $customFileName = $originalFileName . '_' . time() . '.' . $fileExt; // $file = $value->storeAs('public/fca_files', $customFileName); // 下面是你原来的文件信息获取逻辑,可以保留 $file_name_before = $value->getClientOriginalName(); $file_ext = $value->getClientOriginalExtension(); $file_size = $value->getSize(); // 补全你没写完的获取文件大小的代码 // ... 这里继续你的后续业务逻辑 }
需要注意的是:如果多个文件用了相同的自定义文件名,后面上传的文件会覆盖之前的。所以如果你的场景里可能出现重名文件,一定要在文件名里加上唯一标识(比如时间戳、随机字符串、用户ID等),就像上面注释里的示例那样,避免文件被意外覆盖。
内容的提问来源于stack exchange,提问作者BGTabulation BGTabulate
相关产品推荐
相关产品推荐

