ThinkPHP+JQuery实现文件的异步上传

Posted varlemon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP+JQuery实现文件的异步上传相关的知识,希望对你有一定的参考价值。

前端代码

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>ThinkPHP+JQuery实现文件的异步上传</title>
</head>
<body>

<form id="ajax-upload-demo" enctype="multipart/form-data">
    <label>选择文件:</label>
    <input type="file" name="image"><br><br>
    <a href="javascript:uploadFile();">上传</a>
</form>
<br><p id="tips"></p>

<script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script>

    var isUploading = false;

    // 上传文件
    function uploadFile(){
        var form = document.getElementById(\'ajax-upload-demo\');
        if(isUploading) {
            alert(\'文件正在上传...\');
            return false;
        }
        $.ajax({
            url: \'/index/index/uploadApi\',
            type: \'POST\',
            cache: false,
            data: new FormData(form),
            processData: false,
            contentType: false,
            dataType: \'json\',
            beforeSend: function () {
                isUploading = true;
            },
            success: function (json) {
                var arr = JSON.parse(json);
                if(arr.errcode == 10000){
                    // 上传成功
                    alert(\'上传成功\');
                    var url = arr.data.url;
                    var tips = "<a href=\'" + url + "\' target=\'_blank\'>点击查看</a>";
                    $("#tips").empty().append(tips);

                }else{
                    // 上传失败
                    alert(\'上传失败\');
                }
                isUploading = false;
            }
        });
    }
</script>
</body>
</html>

效果图:

PHP代码

<?php
namespace app\\index\\controller;

use think\\Controller;

class Index extends Controller
{
    // 上传表单页面
    public function index()
    {
        return $this->fetch();
    }

    // 上传文件接口
    public function uploadApi(){
        // 获取文件
        $file = request()->file(\'image\');
        if($file){
            // 校验数组
            $validateArr = [ \'ext\' => \'jpg,jpeg,gif,png,bmp\' ];
            // 文件的本地存储路径
            $path = ROOT_PATH . \'public\' . DS . \'upload\';
            // 校验并移动
            $info = $file->validate($validateArr)->move($path);
            // 检查移动结果
            if($info){
                // 上传成功

                // 输出 jpg
                #echo $info->getExtension();

                // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
                #echo $info->getSaveName();

                // 输出 42a79759f284b767dfcb2a0197904287.jpg
                #echo $info->getFilename();

                // 文件的原文件名
                $sourceInfo = $info->getInfo();
                $sourceName = $sourceInfo[\'name\'];

                // 拼装url
                $url = \'/upload/\'.$info->getSaveName();
                $url = str_replace(\'\\\\\', \'/\', $url); // Windows下替换路径分隔符

                // other some operations ...

                // 返回json,告知客户端上传结果
                $json = json_encode([
                    \'errcode\'   => \'10000\',
                    \'errmsg\'    => \'Upload success\',
                    \'data\'      => [ \'url\' => $url ]
                ]);
            }else{
                // 上传失败,返回json,告知客户端
                $json = json_encode([
                    \'errcode\'   => \'20002\',
                    \'errmsg\'    => \'Upload failed\',
                ]);
            }
        }else{
            // 未上传文件
            $json = json_encode([
                \'errcode\'   => \'20001\',
                \'errmsg\'    => \'File not uploaded\',
            ]);
        }
        return $json;
    }
}

上传测试

1. 上传一张图片

2. 上传成功

3. 点击查看

4. 查看图片

5. 查看上传目录

可能出现的错误

1. PHP的上传限制

解决方法
打开PHP的配置文件php.ini

  1. 查找max_execution_time,修改其值为60或更大
  2. 查找post_max_zise,修改其值为128M或更大
  3. 查找upload_max_filesize,修改其值为128M或更大

原因

  1. max_execution_time指的是一次请求最长的执行秒数。如果上传文件过大,则可能服务端还没有接收完文件就结束程序了;
  2. post_max_size指的是POST数据所允许的最大大小;
  3. upload_max_filesize指的是上传文件的最大大小。

本文链接:https://www.cnblogs.com/connect/p/thinkphp-ajax-upload.html

以上是关于ThinkPHP+JQuery实现文件的异步上传的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp 使用插件异步上传图片或者文件

异步 JQUERY 文件上传

thinkphp如何将多张上传的图片根据状态分别存储!

jsp中使用jquery的ajaxfileupload插件怎么实现异步上传

SpringMVC + AJAX 实现多文件异步上传

jsp中使用jquery的ajaxfileupload插件怎么实现异步上传