PHP Filesystem上传文件的使用

Filesystem 函数允许您访问和操作文件系统。Filesystem 函数是 PHP 核心的组成部分,无需安装即可使用这些函数。下面是使用例子:

前端部分,这里我使用ajax上传文件的

<form id="contact-form"  method="post">
    <div class="row">
        <div class="col-md-12">
            <input type="text" name="title" id="res_title" placeholder="標題">
        </div>
        <div class="col-md-6">
            <input type="text" name="name" id="res_name" placeholder="姓名">
        </div>
        <div class="col-md-6">
            <input type="text" name="phone" id="res_phone" placeholder="電話">
        </div>
        <div class="col-md-12">
            <textarea name="content" cols="30" rows="10" placeholder="留言內容"></textarea>
            <input type="hidden" name="cate_id" value="{$cate.id}">
            <input type="file" id="file" name="file" class="button-default"/>
            <button type="button" class="button-default res_button">提交</button>
        </div>
    </div>
</form>


<script>
    $.fn.serializeFiles = function() {
        var form = $(this),formData = new FormData();//通过FormData构造函数创建一个空对象
        var formParams = form.serializeArray();//带有name和value的json,比如{name: "username1", value: "a"}

        //通过append()方法来追加数据,type="file"
        $.each(form.find('input[type="file"]'), function(i, tag) {
            $.each($(tag)[0].files, function(i, file) {
                formData.append(tag.name, file);
            });
        });

        //通过append()方法来追加数据,type="text"
        $.each(formParams, function(i, val) {
            formData.append(val.name, val.value);
        });

        return formData;
    };


    //提交留言
    $(".res_button").click(function () {
        var name = $("#res_name").val();
        var phone = $("#res_phone").val();
        var title = $("#res_title").val();
        if (!title) {
            layer.msg("標題,不能為空!");
            return;
        }
        if (!name) {
            layer.msg("名稱,不能為空!");
            return;
        }
        if (!phone) {
            layer.msg("電話,不能為空!");
            return;
        }
        var formData= $("#contact-form").serializeFiles();

        $.ajax({
            url:"{:url('index/pay_upload')}",
            processData : false, // 使数据不做处理
            contentType : false, // 不要设置Content-Type请求头
            type:"POST",
            data:formData,
            success:function (res) {
                if (res.code == 200) {
                    layer.msg("Success!!",{icon:1,time:2000,end:function(){
                            window.location.reload();
                        }})
                }
            }
        })

    })
</script>

app/common.php

function uploadFile($file, $dir){

    // 使用验证器验证上传的文件
//    validate(['file' => [
//        // 限制文件大小(单位b),这里限制为4M
//        'fileSize' => 4 * 1024 * 1024,
//        // 限制文件后缀,多个后缀以英文逗号分割
//        'fileExt'  => 'gif,jpg,png'
//        // 更多规则请看“上传验证”的规则,文档地址https://www.kancloud.cn/manual/thinkphp6_0/1037629#_444
//    ]])->check(['file' => $file]);

    // 文件名规则,默认是当前时间。可以使用哈希算法,如:md5,sha1等。还可以传入匿名函数
    $rule = 'date()';
    // 将文件保存public磁盘,文件名为$rule指定的规则。然后将文件路径赋值给$path
    $path = \think\facade\Filesystem::disk('public')->putFile($dir, $file);
    // 拼接URL路径
    $url = \think\facade\Filesystem::getDiskConfig('public', 'url') . '/' . str_replace('\\', '/', $path);
    $save_path = \think\facade\Filesystem::getDiskConfig('public', 'root') . '/' . str_replace('\\', '/', $path);

    $url_arr = explode('/', $url );

    $info = [
        'save_path' => str_replace('\\', '/', $save_path),
        // URL路径
        'url'  => str_replace('\\', '/', $url),
        // 文件大小(字节)
        'size' => $file->getSize(),
        // 文件名
        'save_name' => $url_arr[count($url_arr)-1],
        'original_name' => $file->getOriginalName(),
        // 文件MINE:image/jpeg
        'mine' => $file->getMime(),
        //文件扩展名
        'extension' => $file->getOriginalExtension(),
    ];

    return $info;
}

控制器:

//付款上载
public function pay_upload(){
    $param = $this->request->param();

    if ($_FILES) {
            // 上传文件错误或者文件验证不通过时,都会抛出异常,所以要使用try来捕捉异常
            try {
                // 获取上传的文件,如果有上传错误,会抛出异常
                $file = \think\facade\Request::file('file');

                // 如果上传的文件为null,手动抛出一个异常,统一处理异常
                if (null === $file) {
                    // 异常代码使用UPLOAD_ERR_NO_FILE常量,方便需要进一步处理异常时使用
                    throw new \Exception('请上传文件', UPLOAD_ERR_NO_FILE);
                }

                $fileinfo = uploadFile($file, 'payUpload');

                if ($fileinfo) {
                    $param['file_name'] = $fileinfo['original_name'];
                    $param['save_name'] = $fileinfo['save_name'];
                    $param['file_ext'] = $fileinfo['extension'];
                    $param['file_mime_type'] = $fileinfo['mine'];
                    $param['file_size'] = $fileinfo['size'];
                    $param['url'] = $fileinfo['url'];
                    $param['save_path'] = $fileinfo['save_path'];
                }
                $param['create_time'] = time();
                $res = Payupload::insert($param);
                if ($res) {
                    return json(['code' => 200]);
                } else{
                    return json(['code' => 0]);
                }

            } catch (\Exception $e) {
                // 如果上传时有异常,会执行这里的代码,可以在这里处理异常
                return json([
                    'code' => 1,
                    'msg' => $e->getMessage(),
                ]);
            }
        }

        else{
            return json(['code' => 0]);
        }

}

全局设置保存文件的路劲:

 

 

 

 

 

ThinkPHP6.0:https://www.kancloud.cn/monday/thinkphp6/1482307
posted @ 2020-12-06 13:24  不睡  阅读(1282)  评论(0编辑  收藏  举报