PHP:为文件名生成唯一字符串

PHP:为文件名生成唯一字符串,php,laravel,encryption,Php,Laravel,Encryption,我想上传一个唯一的随机字符串作为文件名的文件,如果我上传一个名为file.txt的文件,它将像m84n3nv38tu48a一样散列,如果我再次上传同一个文件,它将不会被保存,因为存在与该散列相同的文件名 然后下载文件,按原始名称搜索,再次散列并比较以在目录中查找 像这样的 public function storeFile(Request $request) { $file = $request->file('file'); $filename = $file->ge

我想上传一个唯一的随机字符串作为文件名的文件,如果我上传一个名为file.txt的文件,它将像m84n3nv38tu48a一样散列,如果我再次上传同一个文件,它将不会被保存,因为存在与该散列相同的文件名

然后下载文件,按原始名称搜索,再次散列并比较以在目录中查找

像这样的

public function storeFile(Request $request) {
    $file = $request->file('file');
    $filename = $file->getClientOriginalName();
    $path = $file->move(storage_path()."\\app\\file", md5_file($file);
    $response = [
        "file Name" => $filename,
        "Extension" => $file->getClientOriginalExtension(),
        "Path" => storage_path().$path
    ];
    return response()->json($response);
}

public function downloadFile($fileName) {
    $fullpath = storage_path()."\\app\\file\\".md5_file($fileName);
    $file = file_exists($fullpath);
    if($file)
        return response()->download($fullpath, $fileName);
    return response()->json('File not Found', 404);
}
downloadFile中的md5_file方法不起作用(显然起作用),因为$fileName是一个字符串(不是文件),所以我得到了一个不同的散列

我如何解决这个问题

编辑


我想用唯一的ID替换整个文件名。

您使用的是哪个Laravel版本?IIRC,Laravel从5.3版开始自动支持此功能,如果您使用正确的外观。不一定能回答您的问题,但可能会以一种非常简单的方式解决。或者,如果您的哈希是基于文件内容的,您可能无法找到您的文件(除非您已经有了文件内容,这将使您无法检索它)。使用
microtime()
uniqid()
计算文件名上的哈希值(当您想要取回它时您知道),并在哈希之前将其连接到文件名。我使用的是laravel 5.6