Laravel 5.5 簡單的檔案請求以及響應

August5th發表於2017-11-29

前言

終於暫時忙完公司工作,本次主要學習 Laravel 的請求和響應相關章節。也再次瞭解的一下 Laravel 的檔案目錄結構,以及如何利用 Chrome 瀏覽器,來檢視 HTTP 響應的資訊,以及網站 Cookie 的相關資訊。

檔案請求

初步接觸檔案上傳與儲存,對 Laravel 的檔案系統還並沒有一個認識,對網站搭建時的檔案系統也沒有一個完整的概念。假如我們將上傳檔案統一儲存在另一臺伺服器上,我們該如何配置我們的 Laravel 檔案系統?這點留在之後具體學習(逃。我們可以先看看最基礎的檔案上傳。

首先,表單頁面的構建,form 表單屬性一定要新增 enctype 屬性,設定為 enctype="multipart/form-data" 這樣才能保證檔案的正常上傳。

其次就是完善你的表單,設定好路由以及控制器,就可以開始進行測試學習啦!

<?php
    public function store(Request $request)
    {
//        dd($request->all()); // 可以列印出所有請求資料,包括上傳檔案的具體資訊
//        dd($request->file('cover')); // 只列印上傳檔案的資訊
//        dd($request->cover); // 同上一個方法
//        dd($request->hasFile('cover')); // 判斷請求中是否存在對應檔案

//        dd($request->file('cover')->isValid()); //注意,如果名為 cover 的檔案不存在,判斷有效性是會報錯的。所以修改為如下程式碼
//        return $request->hasFile('cover') ? $request->file('cover')->isValid() : '你還沒有上傳檔案吶!!';
//        dd($request->cover->path()); // 訪問檔案路徑
//        dd($request->cover->extension()); // extension 方法會根據檔案內容判斷檔案的副檔名。該副檔名可能會和客戶端提供的副檔名不同

        /**
        *  1. 上傳的時候,若對應的資料夾不存在,Laravel 不會報錯,而是直接在 storage/app 下創造對應資料夾。
        *  2. store 方法返回檔案上傳的路徑,下面第二個例子中,返回 "public/images/aragaki.jpg"
        *  3. 在使用方法前,先判斷上傳的檔案是否真的存在
        */

//        dd($request->cover->store('public/images')); // 檔案會儲存到 storage/app/images 下
        dd($request->cover->storeAs('public/images', 'aragaki.jpg')); // 同上,並且會將上傳資料夾,重新命名為 aragaki.jpg

    }

這裡我們只是簡單的利用 Laravel 上傳了任意型別的檔案,但到了具體的需求,例如"上傳文章封面圖片"的時候,我們需要考慮很多東西。

  • 允許上傳的圖片字尾。例如 ["png", "jpg", 'jpeg']
  • 圖片儲存的資料夾規則。 例如 uploads/articles/cover/images/201711/20/
  • 圖片名的儲存規則
  • 圖片的大小以及圖片的裁剪
  • 圖片名字尾的拼接 ...

你可以將這些內容封裝到一個集中處理類中 例如 app/Handlers/ImageUploadHandler.php
方便以後進行呼叫,你只需要引入這個類,即可。

這裡也是參考《Laravel 實戰進階》教程進行的整理,裡面乾貨真的很多!

請求響應

  1. Laravel 會自動將字串轉換為一個完整的 HTTP 響應。
  2. Laravel 會自動將返回的陣列和 Eloquent 集合轉為 Json 響應。

在返回 Eloquent 集合的時候,可以看到的確是將集合轉換為了 Json 響應,並且資料庫欄位和對應的值都很清晰的展示了出來。

public function avatarApi(Photo $photo)
{
    return $photo->all(); //返回了 json 響應 
}

而我們 dd 列印這個 Eloquent 集合的時候,它返回的是一個 Collection 集合,可以呼叫 toArray() 方法,來獲取資料結構簡單清晰的資料庫欄位及其值,這個時候,返回的是一個陣列。
可見 Laravel 在提供便捷性上,為我們做了很多。

為響應增加頭資訊

如果我們想為上文中的 avatarApi() 中的響應,新增自己的頭部資訊,我們該這麼做。

public function avatarApi(Photo $photo)
{
    $photos = $photo->all();    // 這是需要返回的資訊
    return response($photos)    // 返回響應
        ->header('X-Header-One', 'Header Value')  // 增加頭資訊
        ->header('X-Header-Two', 'Header Value'); // 同上
}

我們可以在 chrome 瀏覽器的控制檯中,進行檢視。
file

為響應增加 Cookie

繼續為上面的響應再增加 Cookie

->header('X-Header-Two', 'Header Value')
->cookie('avatar_api', 'value', 3600, '/avatar_api');

這裡關於 cookie($name, $value, $minutes, $path, $domain, $secure, $httpOnly) 的引數,其實和 PHP 原生的 setcookie() 函式是一樣的。

  1. $name 是 cookie 變數名稱標識
  2. $value 是 cookie 變數的初始值
  3. $minutes 表示該 cookie 變數的有效時間,這裡設定的是 1 個小時。
  4. $path 為該 cookie 變數的相關路徑
  5. $domain 表示 cookie 變數的網站,只有在該網站下,cookie 才會產生
  6. $secure 則需要在 https 的安全傳輸時才有效

我們也同樣可以在 chrome 的控制檯中進行檢視。(多利用自帶的 Clear storage 清理 cookie 進行測試。)
file

預設情況下,Laravel 生成的所有 Cookie 都是經過加密和簽名的,不能被客戶端修改或者讀取。
要想不加密,你可以根據文件的方法進行修改,效果如下。
file

補充:路由快取

官方手冊提供一種程式的優化方案,就是將我們訪問的路由快取起來,利用命令

$ php artisan route:cache

但是,快取有一定的限制,基於閉包的路由不能被快取。如果要使用路由快取,你必須將所有的閉包路由轉換成控制器路由。

同時,還有一點,快取之後,你再新增的路由就會失效,直接跳到 404 頁面,要想生效,你必須滿足以下兩個條件。

  1. 路由必須為控制器路由
  2. 再次對路由進行快取,也就是執行上述命令,它會先清空路由,再快取所有路由,包括新新增的路由。

補充:路由快取清除命令

$ php artisan route:clear

最後

以上整理均為自己的理解,如有錯誤,還望指正,謝謝!

相關文章