php 上传3m文件失败,PHP 文件上传的原理及案例分析

原理

将客户端文件上传至服务器端,在服务器端临时存储,再将服务器端临时存储的文件移至指定位置

实现文件上传需要的知识点:

前端页面

1.form表单必须是用post发送方式,因为get会将参数带到url中,而上传的文件转换后字符会很长,而且也是为了安全性

2.form表单需要使用enctype=“multipart/form-data”属性,form表单默认的enctype属性值是application/x-www-form-urlencoded,该属性在发送前编码所有字符,而multipart/form-data属性

不会编码字符,在使用包含文件上传控件的表单时,必须使用该值。

3.input 中用到了type="file"属性

后端php页面

1.$_FILES:通过 HTTP POST 方式上传到当前脚本的项目的数组,也就是实现文件上传的数组,它的本质是一个数组,在PHP文档中我们可以看到它有以下几个内容,假设文件上传字段的名称为 userfile(此名称可随意命名的)

$_FILES['userfile']['name'] :客户端机器文件的原名称,也就是即将上传的文件的名称

$_FILES['userfile']['type']:文件的 MIME 类型,如果浏览器提供此信息的话。一个例子是“image/gif”。不过此 MIME 类型在 PHP 端并不检查,因此不要想当然认为有这个值。

$_FILES['userfile']['size']:已上传文件的大小,单位为字节。在限定用户上传文件的大小时将用到。

$_FILES['userfile']['tmp_name']:文件被上传后在服务端储存的临时文件名。

$_FILES['userfile']['error']:和该文件上传相关的错误代码。

文件被上传后,默认地会被储存到服务端的默认临时目录中。

2.move_uploaded_file( 临时文件名 , 指定目录文件名) :此函数将上传的文件移动到新位置,也就是实现文件上传的基本函数,检查并确保由 filename 指定的文件是合法的上传文件,如果文件合法,则将其移动为指定的文件。

3.in_array(‘value’,array,type) :‘value’是要搜索的值,array是要搜索的数组,type是否是要求全等,此参数可选,如果为true,要求搜索的结果不仅是值相等,类型也要相等

4.file_exists(path)检查文件或目录是否存在

5.pathinfo(path,options):以数组的形式分解文件路径的信息,其中options有以下几个参数: . PATHINFO_DIRNAME - 只返回 dirname . PATHINFO_BASENAME - 只返回 basename . PATHINFO_EXTENSION - 只返回 extension

实现上传流程

1.form表单提交 2.使用$_FILE获取上传内容的信息 3.校验上传内容是否符合规定的文件类型以及大小 4.通过检验后使用move_uploaded_file函数,将临时存储文件移至指定位置

案例代码

前端,请忽略样式

上传文件

php代码

if( isset($_POST['submit']) ){

var_dump($_FILES['upfile']);

//将获得的数据存储在变量中

$name = $_FILES['upfile']['name'];

$type = $_FILES['upfile']['type'];

$tmp_name = $_FILES['upfile']['tmp_name'];

$error = $_FILES['upfile']['error'];

$size = $_FILES['upfile']['size'];

//提取文件的扩展名,为今后类型判断做准备

$ext = pathinfo($name,PATHINFO_EXTENSION);

$type_array = array('jpeg','pjeg','gif','png');

//echo $ext;

//设置上传文件后服务器存储位置,如果创建未成功,则说明没有权限

$path = "uploads";

if ( !file_exists( $path) ) {

mkdir($path,0777,true);

chmod($path,0777);

}

//当#error为0时进行大小,格式的判断

if( $error == 0 ) {

if ( $size > 200000) {

exit('上传文件太大!');

}

if ( !in_array($ext,$type_array) ) {

exit('非法文件类型');

}

if ( move_uploaded_file($tmp_name,'uploads/'.$name)) {

echo '文件上传成功!';

}else{

echo '文件上传失败';

}

} else {

switch ($error) {

case 1 :

echo "超过上传文件最大值,请上传2M以内的文件";

break;

case 2:

echo "文件过多,只能上传一个";

break;

case 3:

echo "文件没有完全上传,请重试";

break;

case 4:

echo "未选择上传文件";

break;

case 7:

echo "没有临时文件夹";

break;

}

}

}

在实践时遇到了各种各样的问题,会在另一篇文章中单独说明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值