如何在 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
0會員
22內容數
有軟體開發相關文章。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
阿棋的沙龍 的其他內容
在這篇文章中,將介紹如何使用 Laravel 和 Vue 3,並搭配 Inertia.js 來建立一個簡單的電影資料管理系統。我們將涵蓋電影資料的新增、編輯、刪除等基本操作,並且實現動態更新頁面而不需重新載入。
在這篇文章中,將介紹如何使用 Laravel 與 Vue.js 構建一個具有良好使用體驗的 Web 應用。我們將討論如何組織 Laravel 路由與控制器,並展示如何在前端 Vue.js 中進行頁面切換和資料傳遞。
在現代 Web 開發中,前後端分離的架構越來越受歡迎。本文將帶領你從建立 Laravel 路由、將後端資料傳遞到前端,到如何使用 Tailwind CSS 美化頁面,並將資料儲存到資料庫。
這份指南提供了如何將 Vue.js 和 Laravel 進行集成的詳細步驟,並涵蓋了開發環境的設置、所需的工具、以及相關的安裝和配置方法。下面是步驟的概述與要點,對於有意使用這些技術的開發者將有很大幫助。
在本篇文章中,我們將深入探討如何在 Laravel 中建立關聯資料、使用 Eloquent ORM 操作資料庫,並將資料傳遞到前端視圖。這篇文章將涵蓋從資料庫遷移、Seeder、關聯模型的建立,到資料傳遞的完整流程,並介紹如何在前端展示資料。
在這篇文章中,我們將介紹如何使用 Laravel 的 MVC(模型-視圖-控制器)架構來處理資料的創建、更新、刪除操作,並展示如何使用外鍵連接其他資料表。我們將從前端發送請求到後端,並演示如何在 Controller 中處理這些請求來操作資料。
在這篇文章中,將介紹如何使用 Laravel 和 Vue 3,並搭配 Inertia.js 來建立一個簡單的電影資料管理系統。我們將涵蓋電影資料的新增、編輯、刪除等基本操作,並且實現動態更新頁面而不需重新載入。
在這篇文章中,將介紹如何使用 Laravel 與 Vue.js 構建一個具有良好使用體驗的 Web 應用。我們將討論如何組織 Laravel 路由與控制器,並展示如何在前端 Vue.js 中進行頁面切換和資料傳遞。
在現代 Web 開發中,前後端分離的架構越來越受歡迎。本文將帶領你從建立 Laravel 路由、將後端資料傳遞到前端,到如何使用 Tailwind CSS 美化頁面,並將資料儲存到資料庫。
這份指南提供了如何將 Vue.js 和 Laravel 進行集成的詳細步驟,並涵蓋了開發環境的設置、所需的工具、以及相關的安裝和配置方法。下面是步驟的概述與要點,對於有意使用這些技術的開發者將有很大幫助。
在本篇文章中,我們將深入探討如何在 Laravel 中建立關聯資料、使用 Eloquent ORM 操作資料庫,並將資料傳遞到前端視圖。這篇文章將涵蓋從資料庫遷移、Seeder、關聯模型的建立,到資料傳遞的完整流程,並介紹如何在前端展示資料。
在這篇文章中,我們將介紹如何使用 Laravel 的 MVC(模型-視圖-控制器)架構來處理資料的創建、更新、刪除操作,並展示如何使用外鍵連接其他資料表。我們將從前端發送請求到後端,並演示如何在 Controller 中處理這些請求來操作資料。
你可能也想看
Google News 追蹤
Thumbnail
2025 年,從分享精彩的 #Myvocus2024 年度回顧開始! #Myvocus2024 年度回顧通知已送達 vocus 的 2024 有超過 12 萬筆訂單、35 萬則以上的內容、16 萬以上的新會員、4 千+ 筆數位商品訂單,5 萬 + 則貼文! 曬曬你的 2024 vocus 吧!
Thumbnail
相信大家現在都有在使用網銀的習慣 以前因為打工和工作的關係,我辦過的網銀少說也有5、6間,可以說在使用網銀App方面我可以算是個老手了。 最近受邀參加國泰世華CUBE App的使用測試 嘿嘿~殊不知我本身就有在使用他們的App,所以這次的受測根本可以說是得心應手
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
指令在現代 Laravel Web Applications 中,也是一個相當常見的應用,而 Laravel 也為此準備許多方便實現測試的函數,以下就來為大家介紹: artisan() 函數簽名: artisan($command, $parameters = []) 函數說明:這應該是指令測
在之前的文章中,我們分別演練了 API 測試與資料庫測試,今天則讓我們停下腳步,來介紹一些 Laravel 提供的,與 自動化測試有關的 Trait 吧! DatabaseMigrations 當我們使用了這個 Trait 後,會在每個測試被執行前,先執行 migrate ,接著在測試被執行後,
Thumbnail
2025 年,從分享精彩的 #Myvocus2024 年度回顧開始! #Myvocus2024 年度回顧通知已送達 vocus 的 2024 有超過 12 萬筆訂單、35 萬則以上的內容、16 萬以上的新會員、4 千+ 筆數位商品訂單,5 萬 + 則貼文! 曬曬你的 2024 vocus 吧!
Thumbnail
相信大家現在都有在使用網銀的習慣 以前因為打工和工作的關係,我辦過的網銀少說也有5、6間,可以說在使用網銀App方面我可以算是個老手了。 最近受邀參加國泰世華CUBE App的使用測試 嘿嘿~殊不知我本身就有在使用他們的App,所以這次的受測根本可以說是得心應手
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
※ 原本狀態:伺服器渲染 這是 MVC 架構下的 request / response 示意圖,在這張圖呈現的架構裡,畫面和資料都由同一個架構處理。 伺服器渲染流程: 瀏覽器針對特定網址送出請求。 路由器解析請求後,轉接給對應的 controller。 controller 按照要求,透過
Thumbnail
Lua 開檔寫檔的運用 io.output()...
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
Simple Storage Service (S3) 是 AWS 最常應用到的服務,只要是需要將檔案上傳到雲端的狀況都可以使用S3,本篇文章將介紹如何設定與使用AWS S3。
Thumbnail
在使用laravel中的Queue job的時候 如果希望job中斷還可以重新啟動這個時候就會需要用到Supervisor了 本篇文章為您帶來如何使用Supervisor執行Laravel的queue:work的教學
Thumbnail
有的時候,會希望在物件導向中對原生的Class新增功能的時候,大多我們都會寫一個新的class並繼承。 但是其實Laravel提供了一個不同的方式,讓我們可以在常用的Class上,直接新增想要的function,那就是macro。
Migration在 Laravel 中是一種用來管理資料庫結構變更的機制。它的主要目的是使開發者能夠在應用程序的不同環境中保持資料庫結構的一致性,並輕鬆地進行結構變更
今天讓我們探討「缺乏 Migration Files 與 Factory Files」的 Legacy 情境吧! 很多時候我們會遇到沒有 Migration Files 或 Factory Files 的 Legacy Codebase,原因大概有以下幾種: 該程式庫原本不是以 Laravel
指令在現代 Laravel Web Applications 中,也是一個相當常見的應用,而 Laravel 也為此準備許多方便實現測試的函數,以下就來為大家介紹: artisan() 函數簽名: artisan($command, $parameters = []) 函數說明:這應該是指令測
在之前的文章中,我們分別演練了 API 測試與資料庫測試,今天則讓我們停下腳步,來介紹一些 Laravel 提供的,與 自動化測試有關的 Trait 吧! DatabaseMigrations 當我們使用了這個 Trait 後,會在每個測試被執行前,先執行 migrate ,接著在測試被執行後,