网站配置页面,有个一logo的上传,是个一个图片上传,因为是异步上传,我们需要一个文件上传接口,用于上传文件。这个接口我们做到/app/Http/Controllers/Admin/目录下,因为这个涉及到权限问,只有后台登录后台才能上传,游客不能上传。
第一步:写个文件上的路由,打开/routes/web.php文件,继续写一个上传文件的接口,文件上传是post方式,不能用其它的方式,不然上传不成功。
$router->group(['namespace' => 'Admin', 'prefix' => 'admin'], function () use ($router) {
$router->addRoute(['GET', 'POST'], '/login', 'AuthController@login'); // 登录
$router->addRoute(['GET', 'POST'], '/index', 'IndexController@index');
$router->get('/welcome', 'WelcomeController@index');
$router->addRoute(['GET', 'POST'], '/siteSetting', 'SiteSettingController@set'); // 网站设置
$router->post('/upload', 'UploadController@file'); // 文件上传
});
第二步:写个文件上传的控制器。在/app/Http/Controllers/Admin/目录下
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\File\Exception\FileException;
class UploadController extends Controller
{
public function file(Request $request)
{
try {
// 判断上传的文件是否有效
if ($request->file('file')->isValid()) {
$file = $request->file('file'); // 参数file是前端上传的文件名
// 上传的路径,是绝对路径。base_path()获取到的是从系统根目录到项目目录的路径
$uploadPath = base_path() . '/public/file/';
// 拼接出一个文件名,$file->getClientOriginalExtension()用于获取文件的后缀
$fileName = date('YmdHis') . mt_rand(100, 999) . '.' . $file->getClientOriginalExtension();
$fileRet = $file->move($uploadPath, $fileName);
// 获取不到文件名,提示上传失败
if (!$fileRet->getFilename()) {
$this->response->setMsg(500, '上传失败');
return $this->response->responseJSON();
}
$fileName = '/file/' . $fileRet->getFilename();
$this->response->setData(['file' => $fileName]);
return $this->response->responseJSON();
} else {
Throw new FileException('不是有效的文件');
}
} catch (FileException $exception) {
$this->response->setMsg(500, $exception->getMessage());
}
return $this->response->responseJSON();
}
}
第三步:如果是在类unix操作系统中,注意权限问题,应为权限问题会导致你上传文件不成功。
这个接口不管是图片还是其他文件都是可以上传,我没有做区分,也没有做文件大小、文件类型的限制,这里我只做个演示,你有兴趣,可以自己实现那些功能。
还有就是我做的这个,所有文件都放到了images目录里,为了更好的管理上传文件,应该对文件进行区分,比如,上传的是新闻图片,那么就放到images/news/目录,上传的是商品图片,就放到images/goods/目录,等等,怎么来实现呢?我这里给出两种方式
第一种:继续使用/admin/upload/路由,后边跟上目录参数,比如/admin/upload?dir=news、/admin/upload?dir=goods等
第二种:增加路由,比如行增加路由/admin/upload/news、/admin/upload/goods等等
这个还有一个问题,当我更新图片的话,原有的旧图片,没有被删除,当多次更新logo的话,会有很多logo图片在服务器上,而旧的logo图片白白占用空间却没有任何用处。有一种思路是先建立一个temp_upload目录,所有上传的文件都先放到temp_upload里,逻辑步骤如下:
1:异步上传文件到temp_upload目录里,前端记住文件名A
2:提交表单是,把文件名A一起提交
3:读出原有的数据表中保存的文件名,如果为空则不处理;如果不为空,说明有文件被保存,然后把读出的文件名保存到一个变量上
4:保存提交的数据,成功后执行5、6步
5:把A文件从temp_upload目录里移动到指定的目录下
6:把指定目录中的文件删除
如果是删除一条信息,可以直接删除对应的文件,也可以先不删除而是保存到另外一个目录,在确认不需要了再彻底删除。
完!