如何在 Laravel 中實現檔案上傳與處理(從前端到後端的完整範例)

更新於 發佈於 閱讀時間約 12 分鐘

在這篇文章中,我們將深入探討如何在 Laravel 應用程式中處理檔案上傳。我們將從前端頁面的檔案選擇到後端儲存與顯示檔案的完整流程,涵蓋從用戶選擇檔案,到將其上傳並保存在伺服器,直到如何在資料庫中儲存檔案路徑,並在頁面上顯示它們。這些步驟將有助於您瞭解如何在 Laravel 中高效地處理檔案上傳。

1. 建立檔案上傳服務

在 Laravel 中處理檔案上傳最簡單的方式之一是使用服務來集中管理這些操作。我們將建立一個 FilesService 類別,負責處理檔案的上傳、儲存和轉換等任務。

FilesService.php

<?php

namespace App\Services;

use ZipArchive;
use Illuminate\Support\Facades\File;

class FilesService
{
/**
* 防錯:資料夾不存在時將會自動建立資料夾,避免錯誤
* @param string $dir 要放置的資料夾名稱
*/
protected function createDir($dir)
{
if (!is_dir('upload/')) {
mkdir('upload/');
}

if (!is_dir('upload/' . $dir)) {
mkdir('upload/' . $dir);
}
}

/**
* 上傳檔案
* @param mixed $file 要轉換的File檔案
* @param string $dir 要放置的資料夾名稱
* @return object 回傳資料庫儲存的檔名及路徑
*/
public function fileUpload($file, $dir)
{
// 防錯:檔案不存在或不為檔案時回傳空字串
if (!$file || !$file->isFile()) return '';

// 防錯:資料夾不存在時將會自動建立資料夾,避免錯誤
$this->createDir($dir);

// 取得檔案的副檔名
$data = (object) [
'name' => null,
'path' => null,
];
$data->name = $file->getClientOriginalName();
$hashName = $file->hashName();

// 檔案名稱會被重新命名
$data->path = '/upload/' . $dir . '/' . $hashName;
// 移動到指定路徑
move_uploaded_file($file, public_path() . $data->path);
// 回傳 資料庫儲存用的路徑格式

return $data;
}
}

在這個 FilesService 中,我們創建了幾個主要的功能:

  1. createDir($dir):檢查並創建目錄,確保儲存檔案的資料夾存在。
  2. fileUpload($file, $dir):處理檔案的上傳。這個方法會將檔案移動到伺服器指定的目錄,並返回檔案的路徑。

2. 前端頁面:檔案選擇

接下來,在前端頁面,我們會使用 <input type="file"> 元素來讓用戶選擇檔案。當用戶選擇檔案後,我們會將檔案數據傳遞到後端進行處理。

MovieCreate.vue (前端頁面)

<label for="" class="flex justify-between">
<span>電影圖片</span>
<input type="file" @input="from.img_path = $event.target.files[0]">
</label>

在這段程式碼中,@input 綁定了檔案選擇事件,將選中的檔案存儲在 from.img_path 中。我們會在 from 物件中管理電影的資料,包括名稱、影片長度、導演等。

3. 資料傳遞與處理:Vue.js

在 Vue 組件中,我們需要創建一個 from 物件來保存用戶輸入的資料。然後,我們將這些資料發送到 Laravel 後端進行儲存。

MovieCreate.vue (Vue.js)

export default {
data() {
return {
from: {
name: '',
img_path: null,
film_length: '',
director: '',
publish_date: '',
price: 0,
},
};
},
methods: {
submit() {
router.post(route('movie-store'), this.from)
}
}
};

submit() 方法中,我們將使用 axios 或 Laravel 的 router.post 方法來將資料發送到後端的 movie-store 路由。

4. 控制器與後端處理

在控制器中,我們會將上傳的檔案與其他資料一起儲存。這時,我們會使用 FilesService 來處理檔案上傳的邏輯。

MovieController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Inertia\Inertia;
use App\Models\MovieList;
use App\Services\FilesService;

class MovieController extends Controller
{
public function store(Request $request)
{
$data = $request->all();

// 使用文件服務來處理檔案上傳
$files_service = new FilesService();
$path = $files_service->fileUpload($data['img_path'], 'movie');

// 儲存電影資料到資料庫
MovieList::create([
'movie_types_id' => 1,
'name' => $data['name'],
'img_path' => $path->path,
'director' => $data['director'],
'film_length' => $data['film_length'],
'publish_date' => $data['publish_date'],
'price' => $data['price'],
]);

return redirect(route('movie-index'));
}
}

store() 方法中,我們:

  1. 從請求中獲取所有資料。
  2. 使用 FilesService 上傳圖片並取得圖片的路徑。
  3. 把電影資料(包含圖片路徑)儲存到資料庫。

5. 顯示圖片

最後,我們可以在頁面上顯示已上傳的圖片,這樣用戶就能夠看到他們所上傳的內容。

MovieIndex.vue

<img :src="item.img_path" alt="">

這段程式碼會根據從資料庫中讀取的路徑顯示圖片。

6. 移除 Laravel 預設的空字串轉換

Laravel 有一個預設的中介層會將空字串轉換為 null,這會影響到一些資料處理。為了避免這樣的行為,我們需要註解掉這個中介層。

Kernel.php

protected $middleware = [
\App\Http\Middleware\TrustProxies::class,
\Illuminate\Http\Middleware\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
// 註解這行
// \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

結語

通過這些步驟,成功地在 Laravel 中實現了檔案上傳與處理。這不僅可以讓你輕鬆地上傳各種檔案,還能確保檔案安全地儲存到伺服器上並正確顯示在前端頁面。希望這篇文章能幫助您建立出更高效、可靠的檔案上傳系統!接下來會介紹時間參數與分頁功能。


對於這類的撰寫方式習慣嗎?歡迎多多進行良性的知識交流喔!目前是在學習階段,大家有不同看法的話歡迎進行良性的知識交流!

 

大家可以考慮多多分享文章和考慮訂閱沙龍方案或贊助等喔!不過請注意不要違反著作權等行為。當然決定權都在於您,不會干涉您的任何決定。

 

提醒,文章僅供正當的知識參考,文章不負任何責任。

留言
avatar-img
留言分享你的想法!
旅人小萌-avatar-img
2025/01/08
謝謝您的分享❤️
保持學習的工程師-avatar-img
發文者
2025/01/12
旅人小萌 不客氣,感謝您喔
avatar-img
阿棋的沙龍
2會員
34內容數
有軟體開發相關文章。
阿棋的沙龍的其他內容
2025/02/19
在現代的Web應用中,發送即時郵件通知是一項常見的需求。無論是訂單狀態更新、賬單付款通知,還是帳號活動警報,這些通知都能讓用戶即時了解重要信息,並提升使用者體驗。今天,將介紹如何在Laravel中實現一個簡單的郵件通知系統,並演示如何使用通知來通知使用者。
2025/02/19
在現代的Web應用中,發送即時郵件通知是一項常見的需求。無論是訂單狀態更新、賬單付款通知,還是帳號活動警報,這些通知都能讓用戶即時了解重要信息,並提升使用者體驗。今天,將介紹如何在Laravel中實現一個簡單的郵件通知系統,並演示如何使用通知來通知使用者。
2025/02/12
網站的安全性對於保護用戶資料和防止惡意攻擊至關重要。對於許多應用來說,實現Email驗證和兩步驟驗證(2FA)是增強用戶安全的一種有效方式。今天將探索如何在Laravel框架中實現這兩項功能,並結合Google Gmail的應用程式密碼,從而保障你網站的用戶帳號安全。
2025/02/12
網站的安全性對於保護用戶資料和防止惡意攻擊至關重要。對於許多應用來說,實現Email驗證和兩步驟驗證(2FA)是增強用戶安全的一種有效方式。今天將探索如何在Laravel框架中實現這兩項功能,並結合Google Gmail的應用程式密碼,從而保障你網站的用戶帳號安全。
2025/02/05
在現代網絡安全環境中,網站的安全性至關重要。為了確保你的網站免受各種攻擊,進行網站弱點掃描是不可或缺的一步。今天,將介紹一個強大且免費的網站安全掃描工具——OWASP ZAP(Zed Attack Proxy),它不僅功能強大,且易於使用,適合各種用戶,無論你是初學者還是資深的安全專家。
2025/02/05
在現代網絡安全環境中,網站的安全性至關重要。為了確保你的網站免受各種攻擊,進行網站弱點掃描是不可或缺的一步。今天,將介紹一個強大且免費的網站安全掃描工具——OWASP ZAP(Zed Attack Proxy),它不僅功能強大,且易於使用,適合各種用戶,無論你是初學者還是資深的安全專家。
看更多
你可能也想看
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
TOMICA第一波推出吉伊卡哇聯名小車車的時候馬上就被搶購一空,一直很扼腕當時沒有趕緊入手。前陣子閒來無事逛蝦皮,突然發現幾家商場都又開始重新上架,價格也都回到正常水準,估計是官方又再補了一批貨,想都沒想就立刻下單! 同文也跟大家分享近期蝦皮購物紀錄、好用推薦、蝦皮分潤計畫的聯盟行銷!
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
這篇文章教學如何在 React 中建立一個檔案上傳元件,包含檔案選擇、資訊顯示、狀態管理、即時進度回饋等功能,並使用 Axios 處理檔案上傳。
Thumbnail
這篇文章教學如何在 React 中建立一個檔案上傳元件,包含檔案選擇、資訊顯示、狀態管理、即時進度回饋等功能,並使用 Axios 處理檔案上傳。
Thumbnail
檔案上傳是許多網站的核心功能,無論是上傳圖片、文件,甚至是大型的資料檔案。本文將教您如何使用 JavaScript 與 Node.js 搭配 Express 與 Multer 套件,實現檔案上傳功能,並將檔案儲存至伺服器指定的目錄中。
Thumbnail
檔案上傳是許多網站的核心功能,無論是上傳圖片、文件,甚至是大型的資料檔案。本文將教您如何使用 JavaScript 與 Node.js 搭配 Express 與 Multer 套件,實現檔案上傳功能,並將檔案儲存至伺服器指定的目錄中。
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
Laravel是一個以MVC(參考:[設計模式]MVC)為架構的PHP Web框架。Laravel支援使用者身份驗證和授權,提供模組化套件系統。Laravel使用Blade模板系統將PHP程式碼與HTML網頁分離。 安裝環境 下載安裝composer https://getcomposer.o
Thumbnail
底下是HTML的上傳檔案程式碼: <form action="upload.php" method="post" enctype="multipart/form-data"> 選擇檔案: <input type="file" name="file"/><hr/> <input typ
Thumbnail
底下是HTML的上傳檔案程式碼: <form action="upload.php" method="post" enctype="multipart/form-data"> 選擇檔案: <input type="file" name="file"/><hr/> <input typ
Thumbnail
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
Thumbnail
在公司專案裡,除了使用Laravel 提供的輔助函數外,我們還可以透過建構屬於自己的Helper function 可以方便地執行諸如處理陣列、文件路徑、字符串和路由等操作,來協助我們更方便處理重複的程式碼。
Thumbnail
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Thumbnail
本篇文章為Laravel初學者提供了一個指南,深入探討了Laravel的routes目錄下的功能。文章詳細描述了web.php和api.php的差異和使用情境,並簡要介紹了console.php和channels.php的功能。透過這篇文章,讀者可以更好地理解和利用Laravel的路由功能。
Thumbnail
當伺服器需要處理一些比較花時間的任務時(如發送Email、上傳影片等等),讓user等待直到執行完畢,是個很不明智的選擇,這時候就很適合使用Queue,讓工作在背景執行,使用者就能立刻做下一件事,不必在那邊等待。 .env: QUEUE_CONNECTION預設是sync 改成database:
Thumbnail
當伺服器需要處理一些比較花時間的任務時(如發送Email、上傳影片等等),讓user等待直到執行完畢,是個很不明智的選擇,這時候就很適合使用Queue,讓工作在背景執行,使用者就能立刻做下一件事,不必在那邊等待。 .env: QUEUE_CONNECTION預設是sync 改成database:
Thumbnail
Laravel本身是MVC架構的Framework,但隨著專案越來越龐大,若不把系統架構分工再切細一點,可能會導致日後維護的困難。 例如可能會很常發生controller要與model溝通拿資料,又要處理商業邏輯,就會導致controller越來越肥,因此本文要介紹的是....
Thumbnail
Laravel本身是MVC架構的Framework,但隨著專案越來越龐大,若不把系統架構分工再切細一點,可能會導致日後維護的困難。 例如可能會很常發生controller要與model溝通拿資料,又要處理商業邏輯,就會導致controller越來越肥,因此本文要介紹的是....
Thumbnail
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Thumbnail
本文模擬user註冊的情境來簡單演示,在Laravel中如何透過ajax來存取資料,以post request為例。 前端透過post把user資料送到controller中,並且透過model把資料塞進DB,最後回傳json response。 完整source cod
Thumbnail
Laravel Framework version: 8.12.3 本範例做了兩個,一個是進到首頁顯示hello world!,另一個是進到article頁面時,從資料庫把文章抓出來顯示。 ...
Thumbnail
Laravel Framework version: 8.12.3 本範例做了兩個,一個是進到首頁顯示hello world!,另一個是進到article頁面時,從資料庫把文章抓出來顯示。 ...
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News