загружать изображения и хранить URL в базе данных с Laravel - PullRequest
0 голосов
/ 05 марта 2019

Я хочу загрузить несколько изображений и сохранить ее URL в базе данных.

Вот мой код:

<form method="POST" action="{{ route('validated', ['id' => $product->id]) }}) }}">
    @csrf
    <input type="hidden" name="ID" name="ID" value="{{ $product->id  }}">
    <div class="form-group row">
        <label for="Image" class="col-sm-2 col-form-label">Image</label>
        <img src="{{ $product->imageURL }}" />
    </div>
    <div class="form-group row">
        <div class="col-sm-12">
            <button type="submit" class="btn btn-lg btn-success">Valider les données</button> | <a href="#">Relancer le fournisseur</a>
        </div>
    </div>
</form>

и в моей функции контроллера:

$imagePath = Storage::putFile('uploads/image/', $request->image, "imagename");

У меня есть эта ошибка:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError, выданный с сообщение «Вызов функции-члена hashName () для строки»

Stacktrace: 0 Symfony \ Component \ Debug \ Exception \ FatalThrowableError in C: \ laragon \ WWW \ MyProject \ поставщика \ Laravel \ Framework \ SRC \ Осветите \ Filesystem \ FilesystemAdapter.php: 208

Ответы [ 5 ]

1 голос
/ 05 марта 2019

Сделайте это, если вы хотите написать повторно используемый код и использовать его по-другому

например, у нас есть модель Post и Image в модели Image, добавьте этот код

public function post()
    {
        return $this->belongsTo(Post::class);
    }
 public static function named($name,$type)
{
    $photo = new static;
    $photo->saveAs($name,$type);
    return $photo;
}
public function saveAs($name,$type)
{
    $this->path = sprintf("%s/%s/%s-%s",'baseDir',$type,time(), $name);
    $this->name = sprintf("%s-%s", time(), $name);
    $this->type = $type;
}
public function moves(UploadedFile $file,$type)
{
    $file->move($this->baseDir.'/'.$type, $this->name);
    return $this;
}

и в модельчто вы хотите добавить изображение для этого как сообщение:

    public function images()
    {
        return $this->hasMany(Image::class);
    }
     public function addImages(Image $image)
    {
        return $this->images()->save($image);
    }

и в контроллерах:

public function addImages(ImageRequest $request,$id)
 {
    $image = $this->makeImage($request->file('file'),$request->type);
    Post::where('id' ,'=', $id)->first()->addImage($image);
    return back();
 }

 protected function makeImage(UploadedFile $file,$type)
   {
     return Image::named($file->getClientOriginalName(),$type)->moves($file,$type);

   }
1 голос
/ 05 марта 2019

Прежде всего ваша форма должна иметь атрибут enctype="multipart/form-data", если вы хотите загрузить изображение.

На основе Документация Laravel вы можете использовать что-то вроде этого:

$path = $request->file('image')->store('image');
1 голос
/ 05 марта 2019

Привет, я думаю, вам нужно использовать метод putFileAs для настройки имени, например:

//Manually specify a file name...
Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');

Этот метод принимает экземпляр Illuminate \ Http \ File или Illuminate \ Http \ UploadedFile и автоматически выполняет потоковую передачуфайл в нужное место:

источник

1 голос
/ 05 марта 2019

Для загрузки нескольких изображений вы можете попробовать этот код :

$images = $request->file('images');
foreach ($images as $key => $image) {

    if ($request->hasFile('images') && $request->file('images')[$key]->isValid()) {
        $urlPath = $request->images[$key]->store('public/images');

        $image = new Images();
        $image->path = $urlPath;
        $image->save();
    } else {
        return redirect()->back()->withInput()->with('errors', 'Invalid Image file found!');
    }
}

Предполагая, что необходимо добавить enctype="multipart/form-data" в форму и Request $request в аргументах вашей функции, а также storage link в вашем публичном каталоге.

Надеюсь, это будет полезно.Спасибо

1 голос
/ 05 марта 2019

Если вы используете Laravel, у вас должно получиться сделать следующее:

$imagePath = $request->file('image')->store('uploads/image');

Или, если вы хотите указать имя файла, вы можете сделать:

$imagePath = $request->file('image')->storeAs('uploads/image', 'myfilename.jpg');

ОБНОВЛЕНО

Я заметил, что в вашей HTML-форме нет ввода для загрузки файла.Если у вас его нет, у Laravel не будет файла для хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...