laraveladmin从入门到弃用(二、ueditor实现图片上传以及上传限制)

编程

一、安装ueditor

通过官方扩展  https://laravel-admin.org/extensions 找到 ueditor ,然后按照文档安装完成,并进行基础的配置操作剩余的就和文档没有关系了(不敢有异议)

 

以下是升级配置

二、编辑器工具栏配置

根据 vendorcodingyularavel-ueditorsrcconfigueditor.php 这个文件配置

三、图片上传

修改 config/admin.php 中的 upload 为 以下内容

// Disk in `config/filesystem.php`.

"disk" => "admin",

// Image and file upload path under the disk above.

"directory" => [

"image" => "images",

"file" => "files",

],

"hash_filename" => true,

/* 前后端通信相关的配置,注释只允许使用多行方式 */

/* 上传图片配置项 */

"imageActionName" => "upload-image", /* 执行上传图片的action名称 */

// "imageFieldName" => "upfile", /* 提交的图片表单名称 */

"imageFieldName" => "{rand:15}", /* 提交的图片表单名称 */

"imageMaxSize" => 2 * 1024 * 1024, /* 上传大小限制,单位B */

"imageAllowFiles" => [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 上传图片格式显示 */

"imageCompressEnable" => true, /* 是否压缩图片,默认是true */

"imageCompressBorder" => 121, /* 图片压缩最长边限制 */

"imageInsertAlign" => "none", /* 插入的图片浮动方式 */

"imageUrlPrefix" => "", /* 图片访问路径前缀 */

"imagePathFormat" => "/uploads/image/{yyyy}{mm}/", /* 上传保存路径,可以自定义保存路径和文件名格式 */

"imageWidth" => 121, /* 上传图片宽 */

"imageHeight" => 75, /* 上传图片高 */

/* {filename} 会替换成原文件名,配置这项需要注意中文乱码问题 */

/* {rand:6} 会替换成随机数,后面的数字是随机数的位数 */

/* {time} 会替换成时间戳 */

/* {yyyy} 会替换成四位年份 */

/* {yy} 会替换成两位年份 */

/* {mm} 会替换成两位月份 */

/* {dd} 会替换成两位日期 */

/* {hh} 会替换成两位小时 */

/* {ii} 会替换成两位分钟 */

/* {ss} 会替换成两位秒 */

/* 非法字符 => * ? " < > | */

/* 具请体看线上文档 => fex.baidu.com/assets/#use-format_upload_filename */

/* 涂鸦图片上传配置项 */

"scrawlActionName" => "upload-scrawl", /* 执行上传涂鸦的action名称 */

"scrawlFieldName" => "upfile", /* 提交的图片表单名称 */

"scrawlPathFormat" => "/uploads/image/{yyyy}{mm}/", /* 上传保存路径,可以自定义保存路径和文件名格式 */

"scrawlMaxSize" => 2048000, /* 上传大小限制,单位B */

"scrawlUrlPrefix" => "", /* 图片访问路径前缀 */

"scrawlInsertAlign" => "none",

/* 截图工具上传 */

"snapscreenActionName" => "upload-image", /* 执行上传截图的action名称 */

"snapscreenPathFormat" => "/uploads/image/{yyyy}{mm}/", /* 上传保存路径,可以自定义保存路径和文件名格式 */

"snapscreenUrlPrefix" => "", /* 图片访问路径前缀 */

"snapscreenInsertAlign" => "none", /* 插入的图片浮动方式 */

/* 抓取远程图片配置 */

// "catcherLocalDomain" => ["127.0.0.1", "localhost", "img.baidu.com"],

// "catcherActionName" => "catch-image", /* 执行抓取远程图片的action名称 */

// "catcherFieldName" => "source", /* 提交的图片列表表单名称 */

// "catcherPathFormat" => "/uploads/image/{yyyy}/{mm}/{dd}/", /* 上传保存路径,可以自定义保存路径和文件名格式 */

// "catcherUrlPrefix" => "", /* 图片访问路径前缀 */

// "catcherMaxSize" => 2048000, /* 上传大小限制,单位B */

// "catcherAllowFiles" => [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 抓取图片格式显示 */

/* 上传视频配置 */

// "videoActionName" => "upload-video", /* 执行上传视频的action名称 */

// "videoFieldName" => "upfile", /* 提交的视频表单名称 */

// "videoPathFormat" => "/uploads/video/{yyyy}/{mm}/{dd}/", /* 上传保存路径,可以自定义保存路径和文件名格式 */

// "videoUrlPrefix" => "", /* 视频访问路径前缀 */

// "videoMaxSize" => 102400000, /* 上传大小限制,单位B,默认100MB */

// "videoAllowFiles" => [

// ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",

// ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid", ], /* 上传视频格式显示 */

/* 上传文件配置 */

"fileActionName" => "upload-file", /* controller里,执行上传视频的action名称 */

"fileFieldName" => "upfile", /* 提交的文件表单名称 */

"filePathFormat" => "/uploads/file/{yyyy}{mm}/", /* 上传保存路径,可以自定义保存路径和文件名格式 */

"fileUrlPrefix" => "", /* 文件访问路径前缀 */

"fileMaxSize" => 51200000, /* 上传大小限制,单位B,默认50MB */

"fileAllowFiles" => [

".png", ".jpg", ".jpeg", ".gif", ".bmp",

// ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",

// ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",

// ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",

".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml",

], /* 上传文件格式显示 */

/* 列出指定目录下的图片 */

"imageManagerActionName" => "list-image", /* 执行图片管理的action名称 */

"imageManagerListPath" => "/uploads/image/", /* 指定要列出图片的目录 */

"imageManagerListSize" => 20, /* 每次列出文件数量 */

"imageManagerUrlPrefix" => "", /* 图片访问路径前缀 */

"imageManagerInsertAlign" => "none", /* 插入的图片浮动方式 */

"imageManagerAllowFiles" => [".png", ".jpg", ".jpeg", ".gif", ".bmp"], /* 列出的文件类型 */

/* 列出指定目录下的文件 */

"fileManagerActionName" => "list-file", /* 执行文件管理的action名称 */

"fileManagerListPath" => "/uploads/file/", /* 指定要列出文件的目录 */

"fileManagerUrlPrefix" => "", /* 文件访问路径前缀 */

"fileManagerListSize" => 20, /* 每次列出文件数量 */

"fileManagerAllowFiles" => [

".png", ".jpg", ".jpeg", ".gif", ".bmp",

// ".flv", ".swf", ".mkv", ".avi", ".rm", ".rmvb", ".mpeg", ".mpg",

// ".ogg", ".ogv", ".mov", ".wmv", ".mp4", ".webm", ".mp3", ".wav", ".mid",

// ".rar", ".zip", ".tar", ".gz", ".7z", ".bz2", ".cab", ".iso",

".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".txt", ".md", ".xml",

], /* 列出的文件类型 */

 

添加   intervention/image 扩展  ,实现的是 上传图片尺寸限制,大于设置尺寸就会裁剪

 安装:composer require intervention/image

发布配置:php artisan vendor:publish --provider="InterventionImageImageServiceProviderLaravelRecent"

封装方法如下:

publicfunctionreduceSize($file_path,$max_width)

{

// 先实例化,传参是文件的磁盘物理路径

$image=Image::make($file_path);

// 进行大小调整的操作

$image->resize($max_width,null,function($constraint){

// 设定宽度是 $max_width,高度等比例缩放

$constraint->aspectRatio();

// 防止裁图时图片尺寸变大

$constraint->upsize();

});

// 对图片修改后进行保存

$image->save();

报错:Call to undefined method InterventionImageImage::make() 解决

打开config/app.php ,找到  providers数组 ,添加

InterventionImageImageServiceProvider::class

 

同文件中  aliaes数组:

"Image" => InterventionImageFacadesImage::class

 

报错:
Call to undefined method InterventionImageImage::make()

把 use InterventionImageImage;

替换为 

use InterventionImageImageManagerStatic as Image;

 

以下是修改后台的  vendorcodingyularavel-ueditorsrcStorageManager.php 文件

<?php

/*

* This file is part of the overtrue/laravel-ueditor.

*

* (c) overtrue <i@overtrue.me>

*

* This source file is subject to the MIT license that is bundled

* with this source code in the file LICENSE.

*/

namespace CodingyuLaravelUEditor;

use IlluminateSupportArr;

use IlluminateSupportStr;

use IlluminateHttpRequest;

use IlluminateSupportFacadesStorage;

use CodingyuLaravelUEditorEventsCatched;

use CodingyuLaravelUEditorEventsUploaded;

use CodingyuLaravelUEditorEventsUploading;

use IlluminateContractsFilesystemFilesystem;

//use InterventionImageImage;

use InterventionImageImageManagerStatic as Image;

use SymfonyComponentHttpFoundationFileUploadedFile;

/**

* Class StorageManager.

*/

class StorageManager

{

use UrlResolverTrait;

/**

* @var IlluminateContractsFilesystemFilesystem

*/

protected $disk;

/**

* Constructor.

*

* @param IlluminateContractsFilesystemFilesystem $disk

*/

public function __construct(Filesystem $disk)

{

$this->disk = $disk;

}

/**

* Upload a file.

*

* @param IlluminateHttpRequest $request

*

* @return IlluminateHttpJsonResponse

*/

public function upload(Request $request)

{

$config = $this->getUploadConfig($request->get("action"));

// $config = ["action","field_name","max_size","allow_files","path_format"];

if (!$request->hasFile($config["field_name"])) {

return $this->error("UPLOAD_ERR_NO_FILE");

}

$file = $request->file($config["field_name"]);

if ($error = $this->fileHasError($file, $config)) {

return $this->error($error);

}

$filename = $this->getFilename($file, $config);

if ($this->eventSupport()) {

$modifiedFilename = event(new Uploading($file, $filename, $config), [], true);

$filename = !is_null($modifiedFilename) ? $modifiedFilename : $filename;

}

$this->store($file, $filename);

// 图片裁剪到指定尺寸

$adminConf = config("admin.upload");

$imgData = getimagesize($this->getUrl($filename));

if($imgData[0] > $adminConf["imageWidth"] OR $imgData[1] > $adminConf["imageHeight"]){

$this->reduceSize(public_path("admin").$filename, $adminConf["imageWidth"]);

}

$imgName = substr($filename,strripos($filename,"/")+1);

// $response = [

// "state" => "SUCCESS",

// "url" => $this->getUrl($filename),

// "title" => $filename,

// "original" => $file->getClientOriginalName(),

// "type" => $file->getExtension(),

// "size" => $file->getSize(),

// ];

$response = [

"state" => "SUCCESS",

"url" => $this->getUrl($filename),

"title" => $imgName,

"original" => $imgName,

"type" => $file->getExtension(),

"size" => $file->getSize(),

];

if ($this->eventSupport()) {

event(new Uploaded($file, $response));

}

//删除源文件

// unlink($filename);

return response()->json($response);

}

/**

* Fetch a file.

*

* @param IlluminateHttpRequest $request

*

* @return IlluminateHttpJsonResponse

*/

public function fetch(Request $request)

{

$config = $this->getUploadConfig($request->get("action"));

$urls = $request->get($config["field_name"]);

if (count($urls) === 0) {

return $this->error("UPLOAD_ERR_NO_FILE");

}

$urls = array_unique($urls);

$list = array();

foreach ($urls as $key => $url) {

$img = $this->download($url, $config);

$item = [];

if ($img["state"] === "SUCCESS") {

$file = $img["file"];

$filename = $img["filename"];

$this->storeContent($file, $filename);

if ($this->eventSupport()) {

unset($img["file"]);

event(new Catched($img));

}

}

unset($img["file"]);

array_push($list, $img);

}

$response = [

"state" => count($list) ? "SUCCESS" : "ERROR",

"list" => $list

];

return response()->json($response);

}

/**

* Download a file.

*

* @param IlluminateHttpRequest $request

*

* @return Array $info

*/

private function download($url, $config)

{

if (strpos($url, "http") !== 0) {

return $this->error("ERROR_HTTP_LINK");

}

$pathRes = parse_url($url);

$img = new SplFileInfo($pathRes["path"]);

$original = $img->getFilename();

$ext = $img->getExtension();

$title = md5($url) . "." . $ext;

$filename = $this->formatPath($config["path_format"], $title);

$info = [

"state" => "SUCCESS",

"url" => $this->getUrl($filename),

"title" => $title,

"original" => $original,

"source" => $url,

"size" => 0,

"file" => "",

"filename" => $filename,

];

$context = stream_context_create(

array("http" => array(

"follow_location" => false, // don"t follow redirects

))

);

$file = fopen($url, "r", false, $context);

if ($file === false) {

$info["state"] = "ERROR";

return $info;

}

$content = stream_get_contents($file);

fclose($file);

$info["file"] = $content;

$info["siez"] = strlen($content);

return $info;

}

/**

* @return bool

*/

public function eventSupport()

{

return trait_exists("IlluminateFoundationEventsDispatchable");

}

/**

* List all files of dir.

*

* @param string $path

* @param int $start

* @param int $size

* @param array $allowFiles

*

* @return Response

*/

public function listFiles($path, $start, $size = 20, array $allowFiles = [])

{

$allFiles = $this->disk->listContents($path, true);

$files = $this->paginateFiles($allFiles, $start, $size);

return [

"state" => empty($files) ? "EMPTY" : "SUCCESS",

"list" => $files,

"start" => $start,

"total" => count($allFiles),

];

}

/**

* Split results.

*

* @param array $files

* @param int $start

* @param int $size

*

* @return array

*/

protected function paginateFiles(array $files, $start = 0, $size = 50)

{

return collect($files)->where("type", "file")->splice($start)->take($size)->map(function ($file) {

return [

"url" => $this->getUrl($file["path"]),

"mtime" => $file["timestamp"],

];

})->all();

}

/**

* Store file.

*

* @param SymfonyComponentHttpFoundationFileUploadedFile $file

* @param string $filename

*

* @return mixed

*/

protected function store(UploadedFile $file, $filename)

{

return $this->disk->put($filename, fopen($file->getRealPath(), "r+"));

}

/**

* Store file from content.

*

* @param string

* @param string $filename

*

* @return mixed

*/

protected function storeContent($content, $filename)

{

return $this->disk->put($filename, $content);

}

/**

* Validate the input file.

*

* @param SymfonyComponentHttpFoundationFileUploadedFile $file

* @param array $config

*

* @return bool|string

*/

protected function fileHasError(UploadedFile $file, array $config)

{

$error = false;

if (!$file->isValid()) {

$error = $file->getError();

} elseif ($file->getSize() > $config["max_size"]) {

$error = "upload.ERROR_SIZE_EXCEED";

} elseif (

!empty($config["allow_files"]) &&

!in_array("." . $file->getClientOriginalExtension(), $config["allow_files"])

) {

$error = "upload.ERROR_TYPE_NOT_ALLOWED";

}

return $error;

}

/**

* Get the new filename of file.

*

* @param SymfonyComponentHttpFoundationFileUploadedFile $file

* @param array $config

*

* @return string

*/

protected function getFilename(UploadedFile $file, array $config)

{

$ext = "." . $file->getClientOriginalExtension();

// $filename = config("ueditor.hash_filename") ? md5($file->getFilename()) . $ext : $file->getClientOriginalName();

$filename = randStr($len=20, $ul=2, $letter=1).$ext;

return $this->formatPath($config["path_format"], $filename);

}

/**

* Get configuration of current action.

*

* @param string $action

*

* @return array

*/

protected function getUploadConfig($action)

{

// $upload = config("ueditor.upload");

$upload = config("admin.upload");

// prt($upload);

$prefixes = [

"image", "scrawl", "snapscreen", "catcher", "video", "file",

"imageManager", "fileManager",

];

$config = [];

foreach ($prefixes as $prefix) {

if ($action == $upload[$prefix . "ActionName"]) {

$config = [

"action" => Arr::get($upload, $prefix . "ActionName"),

"field_name" => Arr::get($upload, $prefix . "FieldName"),

"max_size" => Arr::get($upload, $prefix . "MaxSize"),

"allow_files" => Arr::get($upload, $prefix . "AllowFiles", []),

"path_format" => Arr::get($upload, $prefix . "PathFormat"),

];

break;

}

}

return $config;

}

/**

* Make error response.

*

* @param $message

*

* @return IlluminateHttpJsonResponse

*/

protected function error($message)

{

return response()->json(["state" => trans("ueditor::upload.{$message}")]);

}

/**

* Format the storage path.

*

* @param string $path

* @param string $filename

*

* @return mixed

*/

protected function formatPath($path, $filename)

{

$replacement = array_merge(explode("-", date("Y-y-m-d-H-i-s")), [$filename, time()]);

$placeholders = ["{yyyy}", "{yy}", "{mm}", "{dd}", "{hh}", "{ii}", "{ss}", "{filename}", "{time}"];

$path = str_replace($placeholders, $replacement, $path);

//替换随机字符串

if (preg_match("/{rand:([d]*)}/i", $path, $matches)) {

$length = min($matches[1], strlen(PHP_INT_MAX));

$path = preg_replace("/{rand:[d]*}/i", str_pad(mt_rand(0, pow(10, $length) - 1), $length, "0", STR_PAD_LEFT), $path);

}

if (!Str::contains($path, $filename)) {

$path = Str::finish($path, "/") . $filename;

}

return $path;

}

/**

* @param $file_path

* @param $max_width

*/

public function reduceSize($file_path, $max_width = null, $max_hight = null){

// 先实例化,传参是文件的磁盘物理路径

$image = Image::make($file_path);

// 进行大小调整的操作

$image->resize($max_width, $max_hight, function ($constraint) {

// 设定宽度是 $max_width,高度等比例缩放

$constraint->aspectRatio();

// 防止裁图时图片尺寸变大

$constraint->upsize();

});

// 对图片修改后进行保存

$image->save();

}

}

/****************************************

* @Explain: 随机生存字符串

* @Remarks:

* @Param: $len:生存字符串的长度, $ul:大小写的区别,1:大小写混合,2:小写,3:大写, $letter:字符性质,1:数字和字符混合,2:纯字符,3:纯数字

* @Return:

****************************************/

function randStr($len=0, $ul=1, $letter=1){

$len = (int)$len;

if($len < 1){return "";}

$strArr = array("1","2","3","4","5","6","7","8","9","0","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z");

if($letter == 3){

$strArr = array_slice($strArr, 0, 10);

}elseif ($letter == 2){

$strArr = array_slice($strArr, 10);

}

$max = count($strArr) - 1;

$result = "";

for ($i=0;$i<$len;$i++){

$key = rand(0, $max);

$result .= $strArr[$key];

}

if($ul == 2){

$result = strtolower($result);

}elseif ($ul == 3){

$result = strtoupper($result);

}

return $result;

}

 

缓慢更新中

以上是 laraveladmin从入门到弃用(二、ueditor实现图片上传以及上传限制) 的全部内容, 来源链接: utcz.com/z/515756.html

回到顶部