Laravel 中的檔案上傳

cangsongbayu發表於2020-01-08

Laravel 使用 Illuminate\Http\Request 的 file() 方法來獲取使用者上傳的檔案 ,返回 Symfony\Component\HttpFoundation\File\UploadedFile 例項

$request->file('photo');
// 或者
$request->photo;

驗證上傳檔案要分兩步 ,首先驗證使用者是否有上傳檔案 ,如果有再驗證檔案是否上傳成功

if ($request->hasFile('file') && $request->file('file')->isValid()) {
    // isValid() 在檔案自身上呼叫 ,如果沒有上傳檔案就呼叫會產生報錯 , 因此先使用 hasFile() 檢測是否有上傳檔案
}
// 繼承關係
Symfony\Component\HttpFoundation\File\UploadedFile extends Symfony\Component\HttpFoundation\File\File;

下列方法名中帶有 Client 的 ,表示相關資訊是從請求中提取 ,因此未必可信

成員 說明 示例
getClientOriginalName() 返回上傳檔案的原始名稱 -
getClientOriginalExtension() 返回上傳檔案的字尾名 -
getClientMimeType() 返回上傳檔案的 MIME 型別 -
guessClientExtension() 返回上傳檔案的字尾名 -
getClientSize() 返回上傳檔案的位元組大小 -
getError() 返回上傳檔案的錯誤資訊 ,成功返回 UPLOAD_ERR_OK 常量 ,失敗返回 UPLOAD_ERR_XXX 系列的其他常量 -
isValid() 驗證檔案是否成功上傳 -
move($directory, $name = null) 將上傳移動到 $directory + $name( 如果有 ) -
getMaxFilesize() 返回 php.ini 中 upload_max_filesize 配置的值 -
getErrorMessage() 返回上傳檔案產生的錯誤資訊 -

錯誤常量和錯誤資訊

/**
 * Returns an informative upload error message.
 *
 * @return string The error message regarding the specified error code
 */
public function getErrorMessage()
{
    static $errors = array(
        UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).',
        UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.',
        UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.',
        UPLOAD_ERR_NO_FILE => 'No file was uploaded.',
        UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
        UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
        UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',
    );
    $errorCode = $this->error;
    $maxFilesize = $errorCode === UPLOAD_ERR_INI_SIZE ? self::getMaxFilesize() / 1024 : 0;
    $message = isset($errors[$errorCode]) ? $errors[$errorCode] : 'The file "%s" was not uploaded due to an unknown error.';
    return sprintf($message, $this->getClientOriginalName(), $maxFilesize);
}
// SplFileInfo 是 PHP 的原生類
Symfony\Component\HttpFoundation\File\File extends \SplFileInfo;
成員 說明 示例
guessExtension() 根據檔案的 MIME 型別返回檔案字尾名 ,失敗返回 null -
getMimeType() 返回檔案的 MIME 型別 -

有錯誤的地方歡迎指出 ,或者補充也可以 ,感謝每個對我提出建議的人

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章