php Laravel文件上传和处理与唯一的文件名

dtcbnfnu  于 2023-09-29  发布在  PHP
关注(0)|答案(1)|浏览(141)

我正在做一个Laravel项目,用户可以上传各种类型的文件,包括图像,文档和视频。我想确保每个上传的文件都有一个唯一的文件名,以避免重复使用同名的现有文件。
我已经使用Laravel的内置Storage facade实现了文件上传功能,但我正在努力为每个上传的文件生成和存储唯一的文件名。我想保持原来的文件扩展名,并确保文件名不太长。
下面是我当前代码的简化版本:
public function uploadFile(Request $request){ $file = $request->file('file ');

if ($file) {
    $originalName = $file->getClientOriginalName();
    // Need help generating a unique filename here
    $uniqueFilename = // ??? How to generate a unique filename with the original extension?
    $file->storeAs('uploads', $uniqueFilename, 'public');
}

return response()->json(['message' => 'File uploaded successfully']);

}**
我正在寻找一个解决方案:

  • 为每个上载的文件生成唯一的文件名。- 保留原始文件扩展名。- 确保生成的文件名不会过长。- 避免两个用户同时上传同名文件时发生冲突。
    任何关于如何在Laravel中实现这一点的建议或代码示例都将非常感谢。谢谢你,谢谢!
wnvonmuf

wnvonmuf1#

我通常使用PHP的time()函数来确保生成一个唯一的文件名。你可以使用下面的一些东西。虽然代码未经测试,但我已经在我的项目中使用了它

// first thing first, lets use early exit strategy to get rid of conditional

if ( !$file ) {
  return response()->json(['message' => 'Problem with uploading file']);
}

 // lets get the name of file without extension
$originalName = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
        
// Lets generate unique filename even if two files with same name are uploaded
$uniqueFilename = $originalName . '_' . time() . '_' . Str::random(5) . '.' . $file->getClientOriginalExtension();

// By the way some people use md5 too as below

$uniqueHash = md5($originalName . '_' . time() . '_' . Str::random(5));
$uniqueFileName = $uniqueHash. '.' .$file->getClientOriginalExtension();

// Rest of the code to upload file and then send back response

相关问题