【问题标题】:Laravel Backpack Image Field Type: Store Images with Original File NameLaravel 背包图像字段类型:使用原始文件名存储图像
【发布时间】:2018-03-23 13:11:23
【问题描述】:

我正在使用Laravel Backpack image Field Type 文档上传图片。

在他们的 mutator 示例中,他们使用 md5 文件名,但是我想在存储文件时使用原始文件名。

// if a base64 was sent, store it in the db
    if (starts_with($value, 'data:image'))
    {
        // 1. Make the image
        $image = \Image::make($value);
        // 2. Generate a filename.
        $filename = md5($value.time()).'.jpg';
        // 3. Store the image on disk.
        \Storage::disk($disk)->put($destination_path.'/'.$filename, $image->stream());
        // 4. Save the path to the database
        $this->attributes[$attribute_name] = $destination_path.'/'.$filename;
    }

我知道我需要修改第 2 步,但不完全确定如何修改,我觉得我可能需要修改第 1 步。

附加问题只是为了帮助我理解:第一步“\Image::...”中的“\”是什么

【问题讨论】:

  • 为什么?您不应使用原始文件名。你会遇到各种各样的问题,比如多个用户上传test.jpg,名字带有你的服务器不喜欢的奇怪字符等等。
  • 基本没有原始文件名,因为背包本身不上传图片,文件内容为base64
  • @ceejayoz 本项目不会有多次上传,名称为标准字符
  • 是否有替代 base64 上传 @Danny 的方法?
  • 即使你能以某种方式完美地防止重复文件名,为什么你觉得你需要这个?

标签: laravel laravel-backpack


【解决方案1】:

您可能想尝试使用文件外观和输入外观 https://laravel.com/api/5.4/Illuminate/Support/Facades/File.html

我通常进行的是有一个 FormRequest 来验证输入类型(如果有一个名为 x 或文件类型 jpeg 的文件出现,或者是必需的),或者直接使用 Input Facade 来检索它,File Facade 来存储它周围。如果您接收的是 base64 格式的图像,您可以尝试以下操作:

$file = Input::file('file');
if (!File::exists(storage_path('uploads/'.$destinationPath))) {
  File::makeDirectory(storage_path('uploads/'.$destinationPath), 0755, true);
}
Storage::disk('uploads')->putFileAs($destinationPath, $file, $file->getClientOriginalName());

甚至:

$data = Input::all();
Image::make(file_get_contents($data->base64_image))->save($path);

希望对你有帮助

【讨论】:

  • 这会出现在我的模型中吗?
  • 您可以根据您的设计模式将其放置在您想要的任何位置。只要您使用 Illuminate\Support\Facades\File 编写,就可以从任何地方访问 Facades;例如
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多