Lumen企业站内容管理实战 - 上传文件

网站配置页面,有个一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:把指定目录中的文件删除

如果是删除一条信息,可以直接删除对应的文件,也可以先不删除而是保存到另外一个目录,在确认不需要了再彻底删除。

完!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangpeng52758

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值