"Laravel"이미지 업로드 기능을 만들어 봤습니다.

13949 단어 PHPLaravel
간단한 앨범 프로그램을 만들 때 이미지 업로드 기능과 관련된 부분만 정리했다.

창 만들기


create.blade.php

@extends("layouts.app")

@section("content")
<h3>Create Album</h3>
{!!Form::open(["action" => "AlbumsController@store" , "method" => "POST", "enctype" => "multipart/form-data"])!!}
    {{ csrf_field() }}
    {{Form::text("name","",["placeholder" => "Album Name"])}}
    {{Form::textarea("description","",["placeholder" => "Album Description"])}}
    {{Form::file("cover_image")}}
    {{Form::submit("submit")}}
{!!Form::close()!!}
@endsection
Form 외립면을 사용하여 생성합니다.
'enctype'=>'multipart/form-data'는 두 개 이상의 파일을 요청에 동시에 저장하는 방식입니다.이미지를 업로드하는 폼은 필수입니다.
cover_이미지 저장 이미지 이름의 열입니다.

이미지 저장


이미지 데이터는 데이터베이스에 직접 저장되는 것이 아니라 기본적으로 이미지 자체는 정적 파일이고 이미지의 이름은 데이터베이스에 저장된다.
AlbumsController.php
    public function store(Request $request)
    {
        //拡張子付きでファイル名を取得
        $filenameWithExt = $request->file("cover_image")->getClientOriginalName();

        //ファイル名のみを取得
        $filename = pathinfo($filenameWithExt, PATHINFO_FILENAME);

        //拡張子を取得
        $extension = $request->file("cover_image")->getClientOriginalExtension();

        //保存のファイル名を構築
        $filenameToStore = $filename."_".time().".".$extension;

        $path = $request->file("cover_image")->storeAs("public/album_covers", $filenameToStore);

        $album = new Album;
        $album->name = $request->input("name");
        $album->description = $request->input("description");
        $album->cover_image = $filenameToStore;

        $album->save();

        return redirect("/albums")->with("success", "Album Created");
    }

이름 저장


원본 파일 이름으로 저장할 수도 있지만 가입 시간을 통해 같은 이름의 이미지를 구분할 수 있습니다.
업로드된 파일에서 파일 이름과 확장자를 가져옵니다.에서 기술한 장면은 다음 절차를 이용하여 명세표를 작성하여 개념 디자인에서 체량의 둘레를 분석하도록 한다.

이미지 저장

$path = $request->file("cover_image")->storeAs("public/album_covers", $filenameToStore);
브라우저에서 서버의 파일에 접근하기 위해서는 Laravel 설치 디렉터리에 있는public 디렉터리에 저장해야 합니다.따라서public 디렉터리에 저장되지만 실제 저장된 곳은/storage/app입니다.

public 아래가 아니라 album_covers 이 폴더는/storage/app에서 만든 것으로 저장된 이미지가 그 안에 있습니다.
따라서public 디렉터리와/storage/app 사이에 링크가 있어야 합니다.
>php artisan storage:link
The [public/storage] directory has been linked.
phpartisanstorage:link는 실행을 통해 기호 링크를 만들 수 있고 그 사이에 링크가 있습니다.

퍼블릭에서storage라는 폴더를 만들고 이미지도 저장했습니다.
이렇게 하면 브라우저에서 그림을 볼 수 있다.

저장된 이미지 표시


create.blade.php
@extends("layouts.app")

@section("content")
@if(count($albums) > 0)
<?php
   $colcount = count($albums);
   $i = 1;
 ?>
<div id="albums">
    <div class="row text-center">
        @foreach($albums as $album)
        @if($i == $colcount)
        <div class="medium-4 columns end">
            <a href="/albums/{{$album->id}}">
                <img class="thumbnail" src="storage/album_covers/{{$album->cover_image}}" alt="{{$album->name}}">
            </a>
            <br>
            <h4>{{$album->name}}</h4>
            @else
            <div class="medium-4 columns">
                <a href="/albums/{{$album->id}}">
                    <img class="thumbnail" src="storage/album_covers/{{$album->cover_image}}" alt="{{$album->name}}">
                </a>
                <br>
                <h4>{{$album->name}}</h4>
                @endif
                @if($i % 3 == 0)
            </div>
        </div>
        <div class="row text-center">
            @else
        </div>
        @endif
        <?php $i++;?>
        @endforeach
    </div>
</div>
@else
<p>No Albums To Display</p>
@endif
@endsection
저장할 때 이미지를 public/album_covers에 저장되지만 가져올 때의 경로는storage/album_나는 커버스가 되는 것에 주의하고 싶다.

이미지 삭제


PhotosController
    public function destroy($id)
    {
        $photo = Photo::find($id);

        if(Storage::delete("public/photos/".$photo->album_id."/".$photo->photo))
        {
            $photo->delete();

            return redirect("/")->with("success","Photo Deleted");
        }
    }
이미지의 삭제는 DB 테이블의 데이터뿐만 아니라 응용 프로그램의 저장소에서도 삭제됩니다.

좋은 웹페이지 즐겨찾기