라라벨 - 파일 업로드: 초보자를 위한 종합 가이드

안녕하세요, 야심 찬 개발자 여러분! 오늘 우리는 라라벨에서 파일 업로드의 세계로 흥미로운 여정을 떠납니다. 너의 친구로서 컴퓨터 교사인 저는 이 과정을 단계별로 안내해 드리겠습니다. 프로그래밍에 새로운 분이라면 걱정하지 마세요 - 우리는 기초부터 시작하여 차근차근 진행하겠습니다. 그럼 커피(또는 차, 당신이 좋아하는 것)를 한 잔 마시고, 시작해 보겠습니다!

Laravel - File Uploading

파일 업로드란?

코드로 들어가기 전에 파일 업로드가 정확히 무엇인지 이해해 보겠습니다. 당신이 좋아하는 휴가 사진을 친구에게 온라인으로 공유하려고 할 때, 그 이미지를 컴퓨터에서 웹사이트로 이동하는 과정을 "파일 업로드"라고 부릅니다. 웹 개발에서는 종종 사용자가 다양한 유형의 파일을 업로드할 수 있도록 허용해야 합니다 - 이미지, 문서, 비디오 등 다양합니다!

왜 라라벨을 사용하나요?

우리가 선택한 PHP 프레임워크인 라라벨은 파일 업로드를 매우 간편하게 만들어줍니다. 라라벨은 간단하고 우아한 방법으로 파일 업로드를 처리하여, 애플리케이션이 사용자가 제출한 파일을 안전하고 효율적으로 관리할 수 있도록 보장합니다. 다른 프레임워크에서 파일 업로드를 시도한 후, 라라벨의 직관적인 접근 방식을 감사하게 여길 것입니다!

프로젝트 설정

먼저, 새로운 라라벨 프로젝트를 설정해 보겠습니다. 아직 하지 않았다면 터미널을 열고 다음 명령어를 실행하세요:

composer create-project --prefer-dist laravel/laravel file-upload-demo

이 명령어는 "file-upload-demo"라는 이름의 새로운 라라벨 프로젝트를 생성합니다. 완료되면 프로젝트 디렉토리로 이동합니다:

cd file-upload-demo

파일 업로드 폼 생성

이제 사용자가 파일을 업로드할 수 있는 간단한 폼을 생성해 보겠습니다. resources/views 디렉토리에 새로운 파일 upload.blade.php를 생성하고 다음 코드를 추가하세요:

<!DOCTYPE html>
<html>
<head>
<title>File Upload Demo</title>
</head>
<body>
<h2>파일 업로드</h2>
<form action="{{ route('upload') }}" method="POST" enctype="multipart/form-data">
@csrf
<input type="file" name="file">
<button type="submit">업로드</button>
</form>
</body>
</html>

이를 구분해 보겠습니다:

  1. 우리는 간단한 HTML 폼을 생성했습니다.
  2. action 속성은 나중에 생성할 'upload' 라우트를 가리킵니다.
  3. method은 POST로 설정되어 있으며, 데이터를 서버로 전송합니다.
  4. enctype="multipart/form-data"는 파일 업로드에 필수적입니다 - 브라우저가 파일 데이터를 포함한 형식으로 폼 데이터를 전송하도록 합니다.
  5. @csrf는 CSRF 토큰을 추가하여 크로스 사이트 요청 위조 공격을 방지합니다.
  6. input 타입이 "file"인 입력 필드는 사용자가 장치에서 파일을 선택할 수 있도록 합니다.

라우트 설정

이제 폼이 준비되었으므로, 폼을 표시하고 업로드를 처리할 라우트를 설정해야 합니다. routes/web.php를 엽니다:

use App\Http\Controllers\FileController;

Route::get('/', [FileController::class, 'showForm']);
Route::post('/upload', [FileController::class, 'upload'])->name('upload');

여기서 우리는 두 가지 라우트를 정의하고 있습니다:

  1. 루트 URL ('/')에 대한 GET 라우트로 폼을 표시합니다.
  2. '/upload'에 대한 POST 라우트로 파일 업로드를 처리합니다.

컨트롤러 생성

이제 라우트를 처리할 컨트롤러를 생성해 보겠습니다. 터미널에서 다음 명령어를 실행하세요:

php artisan make:controller FileController

이 명령어는 새로운 컨트롤러 파일을 생성합니다. app/Http/Controllers/FileController.php를 엽니다:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FileController extends Controller
{
public function showForm()
{
return view('upload');
}

public function upload(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$path = $file->store('uploads');
return "파일이 성공적으로 업로드되었습니다! 경로: " . $path;
}
return "파일이 업로드되지 않았습니다.";
}
}

upload 메서드에서 다음이 발생합니다:

  1. 파일이 실제로 업로드되었는지 확인합니다.
  2. 파일이 존재하면 파일을 가져옵니다.
  3. 라라벨의 store 메서드를 사용하여 파일을 'uploads' 디렉토리에 저장합니다.
  4. 성공 메시지와 파일 경로를 반환합니다.

파일 업로드 테스트

이제 파일 업로드 기능을 테스트해 보겠습니다:

  1. 라라벨 개발 서버를 실행하기 위해 터미널에서 php artisan serve를 실행합니다.
  2. 브라우저에서 http://localhost:8000를 방문합니다.
  3. 생성한 업로드 폼을 볼 수 있습니다.
  4. 파일을 선택하고 "업로드" 버튼을 클릭합니다.
  5. 모든 것이 올바르게 작동하면 성공 메시지와 파일 경로를 볼 수 있습니다.

다양한 파일 유형 처리

실제 애플리케이션에서는 다양한 파일 유형을 처리해야 할 수 있습니다. 컨트롤러를 수정하여 이를 처리할 수 있습니다:

public function upload(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$extension = $file->getClientOriginalExtension();

$allowedExtensions = ['jpg', 'png', 'pdf', 'doc', 'docx'];

if (in_array($extension, $allowedExtensions)) {
$path = $file->store('uploads/' . $extension);
return "파일이 성공적으로 업로드되었습니다! 경로: " . $path;
} else {
return "허용되지 않은 파일 유형입니다.";
}
}
return "파일이 업로드되지 않았습니다.";
}

이 업데이트된 버전에서:

  1. 파일 확장자를 가져옵니다.
  2. 허용된 파일 유형 목록을 정의합니다.
  3. 업로드된 파일의 확장자가 허용된 목록에 있는지 확인합니다.
  4. 허용된 경우 파일을 저장하고 성공 메시지를 반환합니다.
  5. 허용되지 않는 경우 오류 메시지를 반환합니다.

업로드된 이미지 표시

이미지 업로드를 처리하는 경우, 업로드된 이미지를 표시할 수 있습니다. 컨트롤러를 수정하여 이를 처리합니다:

public function upload(Request $request)
{
if ($request->hasFile('file')) {
$file = $request->file('file');
$extension = $file->getClientOriginalExtension();

if ($extension === 'jpg' || $extension === 'png') {
$path = $file->store('public/uploads');
$url = asset(Storage::url($path));
return view('image', ['url' => $url]);
} else {
return "JPG 및 PNG 파일만 표시할 수 있습니다.";
}
}
return "파일이 업로드되지 않았습니다.";
}

새로운 뷰 파일 resources/views/image.blade.php를 생성합니다:

<!DOCTYPE html>
<html>
<head>
<title>업로드된 이미지</title>
</head>
<body>
<h2>당신의 업로드된 이미지:</h2>
<img src="{{ $url }}" alt="업로드된 이미지" style="max-width: 500px;">
</body>
</html>

이제 이미지를 업로드하면 이미지가 페이지에 표시됩니다!

결론

축하합니다! 라라벨에서 파일 업로드의 기본을 배웠습니다. 우리는 폼 생성, 파일 업로드 처리, 파일 저장, 그리고 업로드된 이미지를 표시하는 방법을 다루었습니다. 파일 업로드는 강력한 기능이지만, 항상 입력을 검증하고 정제하여 애플리케이션이 안전하게 유지될 수 있도록 해야 합니다.

라라벨 여정을 계속하면서 더 발전된 파일 처리 기술을 배울 수 있을 것입니다. 지금은 손을 박수쳐 주세요 - 당신은 웹 개발 여정에서 큰 걸음을 했습니다!

이 글에서 사용한 메서드의 빠른 참조 표입니다:

메서드 설명
$request->hasFile('file') 파일이 업로드되었는지 확인합니다
$request->file('file') 업로드된 파일을 가져옵니다
$file->store('path') 파일을 지정된 경로에 저장합니다
$file->getClientOriginalExtension() 원래 파일 확장자를 가져옵니다
Storage::url($path) 저장된 파일의 URL을 생성합니다

기쁜 코딩을 하고, 항상 성공적인 업로드를 기원합니다!

Credits: Image by storyset