Правильно загрузить изображение в форме на диск Laravel - PullRequest
1 голос
/ 17 марта 2020

У меня есть форма флаттера, которая содержит текстовые данные и изображение. Я использую пакет http для отправки пост-запроса на Laravel сервер, у которого есть маршрут в API. php вроде:

Route::post('/locations', 'LocationController@store');

Сначала, так как я никогда не пробовал чтобы загрузить изображение в laravel Мне пришлось отключить ввод изображения, чтобы проверить, все ли работает, и я смог успешно отправить запрос с моего внешнего интерфейса с кодом состояния 201 Created с успешно созданной записью в база данных. Поэтому я добавил первые две строки ниже в моем контроллере, чтобы сохранить изображение, из-за которого мои запросы не выполняются с 500 | server error. (остальные строки уже были доступны и работают с предыдущими запросами):

public function store(Request $request)
{
    $locationName = $request["name"];
    $data = base64_decode($request["image"]); // Image sent from flutter like: _image != null ? base64Encode(_image.readAsBytesSync()) : ''
    Storage::disk('public_images')->put("${$locationName}.jpg", $data); // public_images is defined below
    return location::create([
        'name' => $request["name"], 
        'time' => $request["time"],
        'package' => $request["package"],
        'summary' => $request["summary"],
        'info' => $request["info"],
        'image' => $request["image"]
        ]);
}

Я определил диск public_images (в config / filesystems. php) следующим образом: (Я должен сохранить в каталоге publi c, потому что мой сервер не работает с символическими ссылками, но это не моя проблема ):

'public_images' => [
        'driver' => 'local',
        'root'   => public_path() . '/images',
    ],

Теперь я хочу сохранить изображение на диск и получить путь для его сохранения в таблице базы данных, чтобы при доступе из флаттера я использовал только api url вместе с этим путь для отображения изображения в качестве сетевого ресурса. Итак, как правильно загрузить файл из приложения флаттера в laravel бэкэнд? Или я все делаю не так?

Кроме того: поскольку я новичок в загрузке файлов в laravel с флаттера, каковы наиболее эффективные методы загрузки файлов на сервер laravel? Заранее спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете проверить, есть ли у объекта запроса какой-либо файл и является ли он действительным, затем сохранить файл в каталоге publi c и сохранить uri в db.

if($request->hasFile('image') && $request->file('image')->isValid()){
   $file = $request->file('image');
   $filePath = str_replace('public/', '', $file->storeAs('public/dir', 'name.' . $file->guessExtension()));
}

теперь с Laravel baseUrl помощник вы можете сгенерировать полный путь к хранимому файлу и использовать для загрузки, потоковой передачи или принудительной загрузки.

...