关于文件上传如何避免垃圾文件产生的程序设计思路

922 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第16天,点击查看活动详情

先说下大概的场景,就是一个添加文章的页面,文章的封面图需要文件上传,上传文件是一个单独的功能,文件上传成功之后,返回url地址。在页面中回显。然后填写其他信息,最后点击提交数据库。

 

但是,传统思路的文件上传会产生一些垃圾文件,比如,在页面中多次上传文件,我数据库中存的链接只会是你最后传的图片的链接。那你之前传的那些图片其实就没有用了,我也不是收集图片的,要那些玩意也没有用。

 

那该如何避免这个问题呢?

 

我之前就是钻牛角尖里去了,其实很简单:

上传文件的时候,现在图片文件上传至缓存目录,返回链接,回显。

在点击提交写入数据库的时候,将写入数据库的那个图片链接对应的图片移动到正式的图片目录下。

然后写个定时任务,定期去清除缓存目录中的文件。

这样就会避免垃圾文件的产生了~

 

之前还有一个想法是:

将上传文件链接存放至一张数据库表中,写个定时任务方法去查看前一天上传的文件中,那些文件是没有存入数据库表中的,将其删除。然后清空数据表中的数据

这种方法其实也还不错,只是需要添加一张数据库表来临时存储已经存入数据库中的文件信息。

最后,分享一下我在laravel框架中封装的公共上传文件方法:

       /**
     * @name: 公共上传文件方法
     * @author: camellia
     * @date: 2021-02-18 
     * @param:	$file	object  文件流
     * @param:	$filepath	string  文件目录
     * @param:	$file_type	string  文件类型字符串(.png,.bmp,.mp4,.mp3)
     * @param:	$file_size	number  文件大小(字节数)
     */
    public function uploadPublic($file, $filepath, $file_type, $file_size)
    {
        try{
            // 文件存放公共目录
            $path = "./uploads/";
            if (!$file) 
            {
                $result['code'] = -1;
                $result['msg'] = '参数错误,缺少文件流信息!';
                return $result; //没有图片
            }
            //获取图片后缀(如abc.png,获取到的为png)
            $file_ext = $file->extension();

            // 允许上传图片类型数组
            $file_type_array = explode(',', $file_type);
            // 判断格式
            if (!in_array(strtolower('.' . $file_ext), $file_type_array)) 
            {
                $result['code'] = -2;
                $result['msg'] = '文件格式错误!';
                return $result; //格式不符
            }
            // 文件大小(这里取得的是字节数)
            $fileSize = $file->getSize();
            if ($fileSize >= $file_size) 
            {
                $result['code'] = -10;
                $result['msg'] = '文件大小超出限制!';
                return $result;
            }
            //文件重命名
            $new_name = date('Y-m-d-H-i-s', time()) . '_' . rand(1000000, 9999999) . '.' . $file->getClientOriginalExtension();
            // 文件保存目录
            $savepath = $path . $filepath;
            // 如果目录不存在,创建目录
            if (!is_dir($savepath)) 
            {
                $mkdir = "mkdir -p " . $savepath;
                exec($mkdir, $output, $status);
            }
            // 移动文件
            if ($file->move($savepath, $new_name)) 
            {
                $result['code'] = 1;
                $result['name'] = $new_name;
                $result['url'] =  DOMAIN.$filepath . $new_name;
                $result['path'] =  $path . $filepath . $new_name;
                $result['type'] =  $file->getClientOriginalExtension();
                $result['msg'] = '文件上传成功!';
                return $result;
            } 
            else 
            {
                $result['code'] = -3;
                $result['msg'] = '文件上传失败!';
                return $result; //移动失败
            }
        }
        catch(Exception $e)
        {
            $result['code'] = -10;
            $result['msg'] = '上传文件发生错误!';
            return $result; 
        }
        
    }

我想到的方法其实就是这两种,有好的建议,请在下方输入你的评论。

欢迎访问个人博客 guanchao.site