【问题标题】:How NOT to change file extension when uploading it?上传时如何不更改文件扩展名?
【发布时间】:2020-06-04 07:04:37
【问题描述】:

在我的 Laravel 项目中,我需要上传 mp3 文件,但是 Laravel 使用 mpga 作为 mime 类型来验证 mp3 文件类型,我发现在这个 answer 中。

$results = Validator::make($request->all(), [
            "song" => "required|file|mimes:mpga|max:8192",
        ]);

我对此没意见,但我的问题是文件以mpga 扩展名存储,我从answer 知道这个奇怪动作背后的原因。

我如何存储文件

// Upload the song
$filePath = $request->song->store("public/songs");

但我想以mp3 扩展名存储文件。

【问题讨论】:

  • 添加你如何存储文件的代码

标签: laravel validation upload mp3


【解决方案1】:

在没有看到您的代码的情况下,我能建议的最好方法是使用 Storage 类中的 putFileAs() 方法。

此方法允许您在存储文件时指定文件名:

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;

// Manually specify a file name:
Storage::putFileAs(
    'folder',
    new File('/path/to/uploaded-music.mp3'), 
    'stored-song-name.mp3'
);

请参阅 Laravel 文档:https://laravel.com/docs/5.8/filesystem#storing-files


编辑:如果你想像 putFile() 方法一样保持 Laravel 随机文件命名,你可以生成一个随机字符串并附加你的扩展名:

use Illuminate\Http\File;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;

// Manually specify a file name:
Storage::putFileAs(
    'folder',
    new File('/path/to/uploaded-music.mp3'), 
    Str::random(40) . '.mp3'
);

如果您查看Laravel source code,这就是putFile() 生成随机文件名的方式。

【讨论】:

  • 我正在寻找一种方法,同时保持 Laravel 处理文件命名过程。
【解决方案2】:

Lobsterbaz's 答案完美无缺,我也想提供替代答案,这将帮助您保持文件扩展名不变。

上传后Laravel将mp3文件的扩展名更改为mpga,所以这里我将向您展示如何在上传后保持mp3文件的扩展名,下面的代码将帮助您做到这一点:

use Illuminate\Support\Str;


$path = $request->file('song')->storeAs(
    'songs', Str::random(40).".mp3"
);

恭喜,现在您的歌曲将存储为 mp3,但请务必仅上传 mp3 文件并验证 mp3 的 mime,否则可能会破坏文件。

【讨论】:

    猜你喜欢
    • 2017-03-12
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多