• 章节

  • 评论
第1章 第一个python程序与数据存储
1-1第一个python程序与数据存储01
1-2第一个python程序与数据存储02
1-3第一个python程序与数据存储03
1-4第一个python程序与数据存储04
1-5第一个python程序与数据存储05
1-6第一个python程序与数据存储06
第2章 print&input与变量和运算符
2-1print&input与变量和运算符01
2-2print&input与变量和运算符02
2-3print&input与变量和运算符03
2-4print&input与变量和运算符04
2-5print&input与变量和运算符05
2-6print&input与变量和运算符06
2-7print&input与变量和运算符07
2-8print&input与变量和运算符08
2-9print&input与变量和运算符09
第3章 字符串与循环中的while
3-1字符串与循环中的while01
3-2字符串与循环中的while02
3-3字符串与循环中的while03
3-4字符串与循环中的while04
3-5字符串与循环中的while05
3-6字符串与循环中的while06
3-7字符串与循环中的while07
3-8字符串与循环中的while08
第4章 布尔&list与条件循环语句与trutle
4-1布尔&list与条件循环语句与trutle01
4-2布尔&list与条件循环语句与trutle02
4-3布尔&list与条件循环语句与trutle03
4-4布尔&list与条件循环语句与trutle04
4-5布尔&list与条件循环语句与trutle05
4-6布尔&list与条件循环语句与trutle06
4-7布尔&list与条件循环语句与trutle07
4-8布尔&list与条件循环语句与trutle08
4-9布尔&list与条件循环语句与trutle09
第5章 元组&字符串&字典
5-1元组&字符串&字典01
5-2元组&字符串&字典02
5-3元组&字符串&字典03
5-4元组&字符串&字典04
5-5元组&字符串&字典05
第6章 函数基础
6-1函数基础 01
6-2函数基础 02
6-3函数基础 03
6-4函数基础 04
6-5函数基础 05
6-6函数基础 06
6-7函数基础 07
6-8函数基础 08
6-9函数基础 09
第7章 装饰器&偏函数与作用域与异常处理与文件读写
7-1装饰器&偏函数与作用域与异常处理与文件读写01
7-2装饰器&偏函数与作用域与异常处理与文件读写02
7-3装饰器&偏函数与作用域与异常处理与文件读写03
7-4装饰器&偏函数与作用域与异常处理与文件读写04
7-5装饰器&偏函数与作用域与异常处理与文件读写05
7-6装饰器&偏函数与作用域与异常处理与文件读写06
7-7装饰器&偏函数与作用域与异常处理与文件读写07
第8章 os与窗口控制与内存修改与语言
8-1os与窗口控制与内存修改与语言 01
8-2os与窗口控制与内存修改与语言 02
8-3os与窗口控制与内存修改与语言 03
8-4os与窗口控制与内存修改与语言 04
8-5os与窗口控制与内存修改与语言 05
8-6os与窗口控制与内存修改与语言 06
8-7os与窗口控制与内存修改与语言 07
8-8os与窗口控制与内存修改与语言 08
第9章 递归与时间相关模块
9-1递归与时间相关模块 01
9-2递归与时间相关模块 02
9-3递归与时间相关模块 03
9-4递归与时间相关模块 04
9-5递归与时间相关模块 05
9-6递归与时间相关模块 06
9-7递归与时间相关模块 07
9-8递归与时间相关模块 08
9-9递归与时间相关模块 09
第10章 模块的使用与面向对象思想简介
10-1模块的使用与面向对象思想简介 01
10-2模块的使用与面向对象思想简介 02
10-3模块的使用与面向对象思想简介 03
10-4模块的使用与面向对象思想简介 04
10-5模块的使用与面向对象思想简介 05
10-6模块的使用与面向对象思想简介 06
10-7模块的使用与面向对象思想简介 07
10-8模块的使用与面向对象思想简介 08
第11章 面向对象思想的编程
11-1面向对象思想的编程 01
11-2面向对象思想的编程 02
11-3面向对象思想的编程 03
11-4面向对象思想的编程 04
11-5面向对象思想的编程 05
11-6面向对象思想的编程 06
11-7面向对象思想的编程 07
11-8面向对象思想的编程 08
第12章 面向对象提升与收发邮件
12-1面向对象提升与收发邮件01
12-2面向对象提升与收发邮件02
12-3面向对象提升与收发邮件03
12-4面向对象提升与收发邮件04
12-5面向对象提升与收发邮件05
12-6面向对象提升与收发邮件06
12-7面向对象提升与收发邮件07
12-8面向对象提升与收发邮件08
12-9面向对象提升与收发邮件09
第13章 tkinter与银行系统实战
13-1Tkinter与银行系统实战01
13-2Tkinter与银行系统实战02
13-3Tkinter与银行系统实战03
13-4Tkinter与银行系统实战04
13-5Tkinter与银行系统实战05
13-6Tkinter与银行系统实战06
第14章 tkinter
14-1Tkinter01
14-2Tkinter02
14-3Tkinter03
14-4Tkinter04
14-5Tkinter05
14-6Tkinter06
14-7Tkinter07
14-8Tkinter08
第15章 自动化办公与鼠标键盘模拟
15-1自动化办公与鼠标键盘模拟01
15-2自动化办公与鼠标键盘模拟02
15-3自动化办公与鼠标键盘模拟03
15-4自动化办公与鼠标键盘模拟04
15-5自动化办公与鼠标键盘模拟05
15-6自动化办公与鼠标键盘模拟06
15-7自动化办公与鼠标键盘模拟07
15-8自动化办公与鼠标键盘模拟08
第16章 py2与py3的区别和测试
16-1py2与py3的区别和测试01
16-2Py2与py3的区别和测试02
16-3Py2与py3的区别和测试03
16-4Py2与py3的区别和测试04
16-5Py2与py3的区别和测试05
16-6Py2与py3的区别和测试06
16-7Py2与py3的区别和测试07
16-8Py2与py3的区别和测试08
第17章 正则表达式
17-1正则表达式01
17-2正则表达式02
17-3正则表达式03
17-4正则表达式04
17-5正则表达式05
17-6正则表达式06
17-7正则表达式07
17-8正则表达式08
17-9正则表达式09
17-10正则表达式10
第18章 爬虫简介与json
18-1爬虫简介与json01
18-2爬虫简介与json02
18-3爬虫简介与json03
18-4爬虫简介与json04
18-5爬虫简介与json05
18-6爬虫简介与json06
18-7爬虫简介与json07
18-8爬虫简介与json08
18-9爬虫简介与json09
18-10爬虫简介与json10
18-11爬虫简介与json11
第19章 网络编程
19-1网络编程01
19-2网络编程02
19-3网络编程03
19-4网络编程04
19-5网络编程05
19-6网络编程06
19-7网络编程07
19-8网络编程08
19-9网络编程09
第20章 进程、线程
20-1进程、线程01
20-2进程、线程02
20-3进程、线程03
20-4进程、线程04
20-5进程、线程05
20-6进程、线程06
20-7进程、线程07
第21章 线程、协程
21-1线程、协程01
21-2线程、协程02
21-3线程、协程03
21-4线程、协程04
21-5线程、协程05
21-6线程、协程06
21-7线程、协程07
21-8线程、协程08
第22章 mysql
22-1Mysql 01
22-2Mysql 02
22-3Mysql 03
22-4Mysql 04
22-5Mysql 05
22-6Mysql 06
22-7Mysql 07
22-8Mysql 08
22-9Mysql 09
22-10Mysql 10
第23章 mongodb与redis
23-1Mongodb与redis01
23-2Mongodb与redis02
23-3Mongodb与redis03
23-4Mongodb与redis04
23-5Mongodb与redis05
23-6Mongodb与redis06
23-7Mongodb与redis07
23-8Mongodb与redis08
23-9Mongodb与redis09
23-10Mongodb与redis10
23-11Mongodb与redis11
23-12Mongodb与redis12
23-13Mongodb与redis13

print&input与变量和运算符05

上传文件

内置的上传只是上传到本地服务器,上传到远程或者第三方平台的话需要自己扩展。

假设表单代码如下:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image" /> <br> 
<input type="submit" value="上传" /> 
</form>

然后在控制器中添加如下的代码:

public function upload(){
    // 获取表单上传文件 例如上传了001.jpg
    $file = request()->file('image');
    // 移动到框架应用根目录/uploads/ 目录下
    $info = $file->move( '../uploads');
    if($info){
        // 成功上传后 获取上传信息
        // 输出 jpg
        echo $info->getExtension();
        // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        // 输出 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename(); 
    }else{
        // 上传失败获取错误信息
        echo $file->getError();
    }
}

move方法成功的话返回的是一个\think\File对象,你可以对上传后的文件进行后续操作。

多文件上传

如果你使用的是多文件上传表单,例如:

<form action="/index/index/upload" enctype="multipart/form-data" method="post">
<input type="file" name="image[]" /> <br> 
<input type="file" name="image[]" /> <br> 
<input type="file" name="image[]" /> <br> 
<input type="submit" value="上传" /> 
</form>

控制器代码可以改成:

public function upload(){
    // 获取表单上传文件
    $files = request()->file('image');
    foreach($files as $file){
        // 移动到框架应用根目录/uploads/ 目录下
        $info = $file->move( '../uploads');
        if($info){
            // 成功上传后 获取上传信息
            // 输出 jpg
            echo $info->getExtension(); 
            // 输出 42a79759f284b767dfcb2a0197904287.jpg
            echo $info->getFilename(); 
        }else{
            // 上传失败获取错误信息
            echo $file->getError();
        }    
    }
}

上传验证

支持对上传文件的验证,包括文件大小、文件类型和后缀:

public function upload(){
    // 获取表单上传文件 例如上传了001.jpg
    $file = request()->file('image');
    // 移动到框架应用根目录/uploads/ 目录下
    $info = $file->validate(['size'=>15678,'ext'=>'jpg,png,gif'])->move( '../uploads');
    if($info){
        // 成功上传后 获取上传信息
        // 输出 jpg
        echo $info->getExtension();
        // 输出 20160820/42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getSaveName();
        // 输出 42a79759f284b767dfcb2a0197904287.jpg
        echo $info->getFilename(); 
    }else{
        // 上传失败获取错误信息
        echo $file->getError();
    }
}

getSaveName方法返回的是图片的服务器文件地址,并不能直接用于图片的URL地址,尤其在windows平台上必须做转换才能正常显示图片。

如果上传文件验证不通过,则move方法返回false。

验证参数说明
size上传文件的最大字节
ext文件后缀,多个用逗号分割或者数组
type文件MIME类型,多个用逗号分割或者数组


还有一个额外的自动验证规则是,如果上传的文件后缀是图像文件后缀,则会检查该文件是否是一个合法的图像文件。

上传错误提示信息支持多语言,你可以修改语言包来修改错误提示。

上传规则

默认情况下,会在上传目录下面生成以当前日期为子目录,以微秒时间的md5编码为文件名的文件,例如上面生成的文件名可能是:

/home/www/uploads/20160510/42a79759f284b767dfcb2a0197904287.jpg

我们可以指定上传文件的命名规则,使用rule方法即可,例如:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用md5规则
$file->rule('md5')->move('../uploads/');

最终生成的文件名类似于:

application/uploads/72/ef580909368d824e899f77c7c98388.jpg

系统默认提供了几种上传命名规则,包括:

规则描述
date根据日期和微秒数生成
md5对文件使用md5_file散列生成
sha1对文件使用sha1_file散列生成

其中md5和sha1规则会自动以散列值的前两个字符作为子目录,后面的散列值作为文件名。

如果需要使用自定义命名规则,可以在rule方法中传入函数或者方法,例如:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用uniqid规则
$file->rule('uniqid')->move('../uploads/');

生成的文件名类似于:

application/uploads/573d3b6d7abe2.jpg

如果你希望保留原文件名称,可以使用:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$file->move('../uploads/','');

默认情况下,会覆盖服务器上传目录下的同名文件,如果不希望覆盖,可以使用:

// 获取表单上传文件 例如上传了001.jpg
$file = request()->file('image');
// 移动到服务器的上传目录 并且设置不覆盖
$file->move('../uploads/',true,false);

获取文件hash散列值

可以获取上传文件的哈希散列值,例如:

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->md5();
echo $upload->sha1();

可以统一使用hash方法获取文件散列值

// 获取表单上传文件
$file = request()->file('image');
// 移动到服务器的上传目录 并且使用原文件名
$upload = $file->move('/home/www/upload/');
// 获取上传文件的hash散列值
echo $upload->hash('sha1');
echo $upload->hash('md5');

返回对象

上传成功后返回的仍然是一个File对象,除了File对象自身的方法外,并且可以使用SplFileObject的属性和方法,便于进行后续的文件处理。

任务

?不会了怎么办
无数据提示暂无评论哟...我要评论