使用Laravel的Storage::put生成唯一ID

22

我在存储上传文件时使用Laravel的Storage :: putFile(),我喜欢它自动为文件命名并处理文件扩展名的便利性。

现在我想像上传文件一样从远程服务器获取文件(file_get_contents($url)),但是我在文档中找不到相应的方法。

https://laravel.com/docs/5.5/filesystem#storing-filesput方法中,您需要指定文件名。


你可以使用 md5($url) 为该URL生成一个文件名。 - apokryfos
4
在创建文件时,我也感到惊讶需要手动生成文件名。 - Adam
4个回答

22
$filename = uniqid(). '.' .File::extension($file->getClientOriginalName());
//uniqid() is php function to generate uniqid but you can use time() etc.

$path = "Files/Images/"
Storage::disk('local')->put($path.$filename,file_get_contents($file));

最终 file_get_contents 对我起作用了,谢谢。 - Maha Dev

9

2
我不是上传文件,而是从另一个服务器下载。 - Positivity

1

如果有人正在寻找默认的Laravel唯一文件名生成器,在上传新文件时,Laravel在幕后使用Str::random(40)来生成唯一文件名。

这里是UploadedFile实例上使用的store方法,用于存储新文件:

namespace Illuminate\Http;

/**
 * Store the uploaded file on a filesystem disk.
 *
 * @param  string  $path
 * @param  array|string  $options
 * @return string|false
 */
public function store($path, $options = [])
{
    return $this->storeAs($path, $this->hashName(), $this->parseOptions($options));
}

hashName() 方法来自于 Trait FileHelpers.php


该方法是用于 IT 技术中的文件操作。
namespace Illuminate\Http;

/**
 * Get a filename for the file.
 *
 * @param  string|null  $path
 * @return string
 */
public function hashName($path = null)
{
    if ($path) {
        $path = rtrim($path, '/').'/';
    }

    $hash = $this->hashName ?: $this->hashName = Str::random(40);

    if ($extension = $this->guessExtension()) {
        $extension = '.'.$extension;
    }

    return $path.$hash.$extension;
}

如果你遵循Laravel的逻辑,你可以使用Str::random(40)这个Laravel提供的辅助函数来生成一个唯一的文件名。为了更加确保唯一性,你还可以在这个字符串后面附加当前的日期和时间。


1
为确保文件名唯一并获取文件URL的扩展名,您可以按照以下方式操作:
$ext = pathinfo($url, PATHINFO_EXTENSION);    
$filename = bcrypt($url).time().'.'.$ext;

5
bcrypt 也使用了 /,因此在 Linux 环境下这是一个非常糟糕的想法。 - Buddhi741

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接