Laravel 8: загрузка файла с исходным именем файла и расширением

avatar
Jane Doe
9 августа 2021 в 04:48
1259
2
1

В настоящее время у меня есть API, в котором он сохраняет загруженное изображение, но хеширует его, превращает в строки, но сейчас я хочу сохранить исходное имя изображения в базе данных, а не строковый тип.

Контроллер изображений:

namespace App\Http\Controllers;

use App\Models\LessonIMG;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class LessonIMGController extends Controller
{
    public function FileUpload(Request $request, $id)
    {
        $rules = [  
            'file' => 'required',
        ];

        $validator = Validator::make($request->all(), $rules);
        if ($validator->fails()) {
            return response()->json($validator->errors(), 400);
        }
        
        $uploaded_files = $request->file->store('public/uploads/');
        
        $lesson = LessonIMG::find($id);
        $lesson->lesson_image = $request->file->hashName();

        $results = $lesson->save();
        if ($results) {
            return ["result" => "Image Added"];
        } else {
            return ["result" => "Image Not Added"];
        }

        return ["result" => $uploaded_files];
    }

    public function DeleteIMG($id)
    {
        $lesson = LessonIMG::find($id);
        if (is_null($lesson)) {
            return response()->json('Record not found!', 401);
        }

        $lesson->update(['lesson_image' => null]);

        return response('Image Deleted', 200);
    }
}

Будем признательны за любую помощь/предложение. Спасибо!

Источник
matiaslauriti
9 августа 2021 в 05:18
0

Извините, что не смог помочь вам с вашей реальной проблемой, но я могу поделиться с вами некоторыми советами по улучшению кода: 1) Не делайте Validator::make(), а затем if ($validator->fails())...., вы можете просто сделать Validator::validate(...) и это автоматически выдаст исключение, возвращающееся к view с errors в индексе errors, и будет использовать 422 в качестве кода ошибки вместо 400 (способ Laravel). 2) Для обоих методов, использующих $id, вы можете воспользоваться преимуществами Implicit Binding, поэтому нет необходимости в if (is_null(...)) return.

Karl Hill
10 августа 2021 в 03:25
0

К вашему сведению, строка: return ["result" => $uploaded_files]; недоступен из-за ваших возвратов в последнем операторе if.

Jane Doe
11 августа 2021 в 15:47
0

О, не видел, спасибо!

Ответы (2)

avatar
BABAK ASHRAFI
9 августа 2021 в 05:08
2

Вы можете получить любой атрибут файла из запроса в вашем контроллере, как описано в здесь. Полный справочник файловых методов доступен в здесь

$file_extension = $request->file->extension();
$file_mime_type = $request->file->getClientMimeType();
$original_file_name = $request->file->getClientOriginalName();

$uploaded_files = $request->file->store('public/uploads/');
Jane Doe
9 августа 2021 в 05:30
0

Я продолжаю получать BadMethodCallException: метод Illuminate\Http\Request::getClientOriginalExtension не существует

Jane Doe
9 августа 2021 в 05:53
0

Теперь я снова использовал его, и он не показал ошибок, но когда я загружаю через почтальона изображение с именем «image.jpg», оно сохраняется как «XsziBrSJBOLJe4j4HBxVMozweMUFHBh7Gy2bpFCn.jpg» в сохраненной папке.

BABAK ASHRAFI
9 августа 2021 в 05:58
0

@Лимон. $request->file->store() сгенерирует случайную уникальную строку в качестве имени для вашего файла и предотвратит дублирование имени. Если вы хотите хранить свои файлы под своим именем, вы можете использовать $request->file->storeAs('images', 'filename.jpg'); как описано здесь

Jane Doe
9 августа 2021 в 06:35
0

Я понял это сейчас, и спасибо, и я знаю, что если я использую этот код, всякий раз, когда я загружаю новое изображение, он просто заменяет «имя файла.jpg». Что я хотел сделать, так это то, что каждый раз, когда я загружаю изображение, оно просто сохраняет исходное имя файла.

BABAK ASHRAFI
9 августа 2021 в 06:39
0

@Lemon Вы можете добиться этого, используя $request->file->storeAs('images', $request->file->getClientOriginalName().'.'.$request->file->extension());

Jane Doe
9 августа 2021 в 06:53
0

Я попробовал это, и теперь это сработало. Большое спасибо за большую помощь, я изучу этот код. Мне просто интересно, изменит ли этот код также имя файла в базе данных? Потому что это все еще хэш/строка в моей базе данных localhost

BABAK ASHRAFI
9 августа 2021 в 06:55
0

@Lemon, вы должны изменить эту строку $lesson->lesson_image = $request->file->hashName();, чтобы увидеть имя файла в вашей базе данных. В любом случае, если этот ответ был полезен, вы должны отметить его как принятый.

avatar
Parshant Yadav
9 августа 2021 в 05:35
0

Вы можете получить исходный файл, используя метод getClientOriginalName():

$filenameWithExt = $files->getClientOriginalName();